前言
上篇文章介紹了 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 大家可以交流共同學習。