在這個範例中,會使用到下面這兩個函數

cvFindContours 和 cvDrawContours

以及這兩個變數型態

CvMemStorage

CvSeq

 

 

以上知識都了解後,就可以開始來實作了!

這次使用到的範例圖片是下面這張(用小畫家很隨意地畫了...)

命名為Test.png,並放置在D:\

 

開始撰寫程式碼!


#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main()
{
    char fileName[] = "D:\\Test.png";//注意是png檔!上面範例圖片空白的地方其實是去背了
    IplImage *input, *output;//輸入和輸出的圖片
    CvMemStorage *storage;//儲存掃描到的輪廓
    CvSeq *seq = NULL;//儲存到的輪廓所在的位置

    input = cvLoadImage(fileName, CV_LOAD_IMAGE_GRAYSCALE);//載入圖片並轉為灰階
    if (!input)
        cout << "找不到圖片!!!" << endl;
    else
    {
        //初始化
        storage = cvCreateMemStorage();
        output = cvCreateImage(cvGetSize(input), IPL_DEPTH_8U, 4);
        
        cvThreshold(input, input, 200, 255, CV_THRESH_BINARY);//二值化
        cvFindContours(input, storage, &seq, sizeof(CvContour), CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, cvPoint(0, 0));//尋找輪廓
        cvDrawContours(output, seq, CV_RGB(255, 0, 0), CV_RGB(0, 0, 255), 2, 3);//畫出輪廓圖
        cvShowImage("output", output);
        cvWaitKey(0);

        //關閉視窗,釋放記憶體
        cvDestroyWindow("output");
    }

    system("pause");
    return  0;
}


執行結果如下

 

 

還有另一種輪廓檢測的方式,不過由於檢測出來的圖形很...粗曠(難看),有興趣的可以看下面這篇文章

cvApproxPoly

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 Yang 的頭像
    Yang

    Yang的部落格(轉貼文章請註記來源)

    Yang 發表在 痞客邦 留言(0) 人氣()