计算机视觉
图像处理

《Mastering Opencv读书笔记》第一章 实现图像卡通效果

这本书和配套代码网上都有得下载。要实现书中的效果,只要三步:1.使用拉普拉斯算子提取轮廓  2.使用双边滤波器对图像进行平滑 3.根据第一步得到的轮廓模版图,将第二步的结果拷贝过去【填充轮廓图中全白的部分】

由于我的笔记本摄像头坏了,故我的程序读取的是手机拍摄的视频。

下面给出我整理的两段代码:

1.边缘提取:

  1. // GetMySketch.cpp : 定义控制台应用程序的入口点。
  2. //
  3. #include “stdafx.h”
  4. #include<iostream>
  5. #include <opencv2/core/core.hpp>  
  6. #include <opencv2/highgui/highgui.hpp>  
  7. #include <opencv2/imgproc/imgproc.hpp>  
  8. using namespace std;
  9. using namespace cv;
  10. int _tmain(int argc, _TCHAR* argv[])
  11. {
  12.     VideoCapture m_caputre(“test2.avi”);
  13.     Mat m_frame,gray,edges,masks;
  14.     const int MEDIAN_BLUR_FILTER_SIZE = 7;
  15.     const int LAPLACIAN_FILTER_SIZE = 5;
  16.     const int EDGES_THRESHOLD = 80;
  17.     while (true)
  18.     {
  19.         m_caputre>>m_frame;
  20.         if (m_frame.empty()) {
  21.             std::cerr << “ERROR: Couldn’t grab a video frame.” <<
  22.                 std::endl;
  23.             exit(1);
  24.         }
  25.         cvtColor(m_frame,gray,CV_BGR2GRAY);
  26.         medianBlur(gray,gray,MEDIAN_BLUR_FILTER_SIZE);
  27.         Laplacian(gray, edges, CV_8U, LAPLACIAN_FILTER_SIZE);
  28.         threshold(edges, masks, EDGES_THRESHOLD, 255, THRESH_BINARY_INV);
  29.         // Display the processed image onto the screen.
  30.         imshow(“keep smile :)”, masks);
  31.         char keypress = cv::waitKey(20); // Need this to see anything!
  32.         if (keypress==27)
  33.         {
  34.             break;
  35.         }
  36.     }
  37.     return 0;
  38. }

边缘检测结果:


2.最终卡通效果:

  1. // ColorPainting_Cartoon.cpp : 定义控制台应用程序的入口点。
  2. //
  3. #include “stdafx.h”
  4. #include<iostream>
  5. #include <opencv2/core/core.hpp>  
  6. #include <opencv2/highgui/highgui.hpp>  
  7. #include <opencv2/imgproc/imgproc.hpp>  
  8. using namespace std;
  9. using namespace cv;
  10. int _tmain(int argc, _TCHAR* argv[])
  11. {
  12.     VideoCapture m_capture(“test2.avi”);
  13.     Mat m_frame,smallImg,tmp,bigImg,gray,edges,masks,dst;
  14.     int repetitions = 7; // Repetitions for strong cartoon effect.
  15.     const int MEDIAN_BLUR_FILTER_SIZE = 7;
  16.     const int LAPLACIAN_FILTER_SIZE = 5;
  17.     const int EDGES_THRESHOLD = 80;
  18.     m_capture>>m_frame;
  19.     Size size = m_frame.size();
  20.     Size smallSize;
  21.     smallSize.width = size.width/2;
  22.     smallSize.height = size.height/2;
  23.     smallImg = Mat(smallSize, CV_8UC3);
  24.     tmp = Mat(smallSize, CV_8UC3);
  25.     dst= Mat(size,CV_8UC3);
  26.     while (true)
  27.     {
  28.         m_capture>>m_frame;
  29.         if (m_frame.empty()) {
  30.             std::cerr << “ERROR: Couldn’t grab a video frame.” <<
  31.                 std::endl;
  32.             exit(1);
  33.         }
  34.         cvtColor(m_frame,gray,CV_BGR2GRAY);
  35.         medianBlur(gray,gray,MEDIAN_BLUR_FILTER_SIZE);
  36.         Laplacian(gray, edges, CV_8U, LAPLACIAN_FILTER_SIZE);
  37.         threshold(edges, masks, EDGES_THRESHOLD, 255, THRESH_BINARY_INV);
  38.         resize(m_frame, smallImg, smallSize, 0,0, INTER_LINEAR);
  39.         for (int i=0; i<repetitions; i++) {
  40.             int ksize = 9; // Filter size. Has a large effect on speed.
  41.             double sigmaColor = 9; // Filter color strength.
  42.             double sigmaSpace = 7; // Spatial strength. Affects speed.
  43.             bilateralFilter(smallImg, tmp, ksize, sigmaColor, sigmaSpace);
  44.             bilateralFilter(tmp, smallImg, ksize, sigmaColor, sigmaSpace);
  45.         }
  46.         resize(smallImg, bigImg, size, 0,0, INTER_LINEAR);
  47.         dst.setTo(0);
  48.         //! copies those matrix elements to “m” that are marked with non-zero mask elements.
  49.         bigImg.copyTo(dst,masks);
  50.         // Display the processed image onto the screen.
  51.         imshow(“keep smile :)”, dst);
  52.         char keypress = cv::waitKey(20); // Need this to see anything!
  53.         if (keypress==27)
  54.         {
  55.             break;
  56.         }
  57.     }
  58.     return 0;
  59. }

最终效果图:

第一章很简单,后面的肤色模型很水,就没去弄。下一篇,为实现如何将上述代码移植到Android平台上。

转载注明来源:CV视觉网 » 《Mastering Opencv读书笔记》第一章 实现图像卡通效果

分享到:更多 ()
扫描二维码,给作者 打赏
pay_weixinpay_weixin

请选择你看完该文章的感受:

0不错 0超赞 0无聊 0扯淡 0不解 0路过

评论 3

评论前必须登录!