使用 OpenCV 得到图片线稿

来源:互联网 发布:淘宝漫步者官方旗舰店 编辑:程序博客网 时间:2024/05/17 09:39

前言

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

原图

abc

线稿图

dst1

代码分析

    #include <opencv2/opencv.hpp>      #include <cv.h>    #include <highgui.h>    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 是转换过程中用到的中间变量。

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

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

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

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

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

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

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

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

取反前的图片

dst2

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

0 0
原创粉丝点击