使用 OpenCV 得到图片线稿

前言

上篇文章介绍了 OpenCV 的配置方法,本篇介绍一个 OpenCV 的简单用例。使用 OpenCV 得到一张图片的线稿。效果图如下:

原图

使用 OpenCV 得到图片线稿_第1张图片

线稿图

使用 OpenCV 得到图片线稿_第2张图片

代码分析

    #include   
    #include 
    #include 
    int _tmain(int argc, char ** argv)
    {

      cvNamedWindow("show2"); 
      IplImage * src = cvLoadImage("abc.jpg",1);

      IplImage * dst  = cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1);
      IplImage *temp1 = cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,3);
      cvCvtColor(src,dst,CV_RGBA2GRAY);
      cvMorphologyEx(dst,dst,temp1,NULL,CV_MOP_GRADIENT,1);
      cvThreshold(dst,dst,80,80,CV_THRESH_TRUNC);
      cvNot(dst,dst);
      cvShowImage("show2",dst);
      cvReleaseImage(&src);
      cvReleaseImage(&dst);
      cvReleaseImage(&temp1);
      cvWaitKey();
    }

要实现此功能的代码很简单,只需要按上篇文章中的配置方法配置好 OpenCV,然后直接使用上述代码就可以了。注意,代码中图片的路径是相对路径,所以要把图片放在项目的文件夹下。

分析

现在我们来逐行介绍一下:

第七行:创建一个现实图片的窗口;

第八行:加载一副图片;

第十行和第十一行:分别创建一副空的图片,其中 dst 用来接收装换后的图片,temp1 是转换过程中用到的中间变量。

第十二行:将原图片转换成灰度图片

第十三行:是实现转换的核心方法,这里我们使用了其形态梯度的方法。我个人的理解就是寻找图片的边缘。

第十四行:使转换的图片的线条的颜色均匀。

第十五行:对图片取反,为什么要取反稍后解释。

第十六行:显示最后的结果图片。

之后的代码就是释放资源。

现在来解释为什么要对十四行得到的图片进行取反:

其实第十四行代码结束后得到图片是这样的:

取反前的图片

使用 OpenCV 得到图片线稿_第3张图片

所以我们要对其取反才能得到我们想要的结果。由于本人也是刚刚接触 OpenCV 所以解释的可能不够严密,敬请谅解。如果有同学也想学习 OpenCV 大家可以交流共同学习。

你可能感兴趣的:(Android)