使用 OpenCV 得到圖片線稿

前言

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

發佈了29 篇原創文章 · 獲贊 2 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章