您的位置:首页 > 运维架构

使用 OpenCV 得到图片线稿

2016-06-27 10:51 375 查看

前言

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

原图





线稿图





代码分析

#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 是转换过程中用到的中间变量。

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

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

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

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

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

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

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

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

取反前的图片





所以我们要对其取反才能得到我们想要的结果。由于本人也是刚刚接触 OpenCV 所以解释的可能不够严密,敬请谅解。如果有同学也想学习 OpenCV 大家可以交流共同学习。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  图片 opencv