- Mastering OpenCV 4
- Roy Shilkrot David Millán Escrivá
- 401字
- 2021-07-02 14:47:35
Generating a black and white sketch
To obtain a sketch (black and white drawing) of the camera frame, we will use an edge detection filter, whereas to obtain a color painting, we will use an edge preserving filter (bilateral filter) to further smooth the flat regions while keeping edges intact. By overlaying the sketch drawing on top of the color painting, we obtain a cartoon effect, as shown earlier in the screenshot of the final app.
There are many different edge detection filters, such as Sobel, Scharr, and Laplacian filters, or a Canny edge detector. We will use a Laplacian edge filter since it produces edges that look most similar to hand sketches compared to Sobel or Scharr, and is quite consistent compared to a Canny edge detector, which produces very clean line drawings but is affected more by random noise in the camera frames, and therefore the line drawings would often change drastically between frames.
Nevertheless, we still need to reduce the noise in the image before we use a Laplacian edge filter. We will use a median filter because it is good at removing noise while keeping edges sharp, but is not as slow as a bilateral filter. Since Laplacian filters use grayscale images, we must convert from OpenCV's default BGR format to grayscale. In your empty cartoon.cpp file, put this code at the top so you can access OpenCV and STD C++ templates without typing cv:: and std:: everywhere:
// Include OpenCV's C++ Interface
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
Put this and all remaining code in a cartoonifyImage() function in your cartoon.cpp file:
Mat gray;
cvtColor(srcColor, gray, CV_BGR2GRAY);
const int MEDIAN_BLUR_FILTER_SIZE = 7;
medianBlur(gray, gray, MEDIAN_BLUR_FILTER_SIZE);
Mat edges;
const int LAPLACIAN_FILTER_SIZE = 5;
Laplacian(gray, edges, CV_8U, LAPLACIAN_FILTER_SIZE);
The Laplacian filter produces edges with varying brightness, so to make the edges look more like a sketch, we apply a binary threshold to make the edges either white or black:
Mat mask;
const int EDGES_THRESHOLD = 80;
threshold(edges, mask, EDGES_THRESHOLD, 255, THRESH_BINARY_INV);
In the following diagram, you see the original image (to the left) and the generated edge mask (to the right), which looks similar to a sketch drawing. After we generate a color painting (explained later), we also put this edge mask on top to have black line drawings:

- PyTorch自動駕駛視覺感知算法實戰(zhàn)
- 動手玩轉Scratch3.0編程:人工智能科創(chuàng)教育指南
- Mastering Kotlin
- 人人都是網(wǎng)站分析師:從分析師的視角理解網(wǎng)站和解讀數(shù)據(jù)
- Angular開發(fā)入門與實戰(zhàn)
- C語言開發(fā)基礎教程(Dev-C++)(第2版)
- Learning Apache Cassandra
- OpenMP核心技術指南
- 3ds Max印象 電視欄目包裝動畫與特效制作
- TypeScript 2.x By Example
- CodeIgniter Web Application Blueprints
- Java高并發(fā)編程詳解:深入理解并發(fā)核心庫
- Learning WordPress REST API
- VBA Automation for Excel 2019 Cookbook
- Clojure High Performance Programming