OpenCV-輪廓

Canny邊緣檢測算法可以根據像素間的差異檢測出輪廓邊界的像素,但是並沒有將輪廓作爲一個整體。

利用cvFindContours()可以實現把邊緣像素組裝成輪廓。

有關內存和序列的知識比較多和複雜,就不在這裏詳細闡述了。

下面先給出一個輪廓的例子:

給出一個窗口用於顯示圖像,滑動條(trackbar)用於設置閾值,然後對採二值化後的圖像提取輪廓並繪製。控制參數的滑動條變化,更新圖像。

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

using namespace std;
using namespace cv;

const char filename[] = "/Users/linwang/Downloads/Lena.jpg";
IplImage * g_image = cvLoadImage(filename);
IplImage * g_gray  = NULL;

int g_thresh = 100;
CvMemStorage * g_storage = NULL;  //存儲

/*滑動條*/
void on_trackbar(int)
{
    if(g_storage == NULL)
    {
        g_gray = cvCreateImage(cvGetSize(g_image), 8, 1);
        g_storage = cvCreateMemStorage(0);
    }
    else
    {
        cvClearMemStorage(g_storage);
    }
    CvSeq * contours = 0;  //序列
    
    /*1、先轉換成灰度圖像*/
    cvCvtColor(g_image,g_gray,CV_RGB2GRAY);
    cvShowImage("Gray", g_gray);
    
    /*2、二值化,轉換成二值圖像,0和255*/
    cvThreshold(g_gray,g_gray,g_thresh,255,CV_THRESH_BINARY);
    cvShowImage("double-value", g_gray);
    
    /*3、從二值圖像中檢索輪廓,並返回輪廓的個數*/
    cvFindContours(g_gray,g_storage,&contours);
    cvZero(g_gray);
    
    /*4、繪製輪廓*/
    if(contours)
    {
        cvDrawContours(g_gray, contours, cvScalar(255), cvScalar(255), 100);
    }
    cvShowImage("Contours", g_gray);
}


int main()
{
    if(g_image == NULL)
    {
        cout<<"Img is NULL"<<endl;
        return 1;
    }
    cvNamedWindow("Contours",1);
    cvCreateTrackbar("Threshold","Contours",&g_thresh, g_thresh ,on_trackbar);
    
    cvShowImage("Lena", g_image);
    on_trackbar(0);
    cvWaitKey(0);
    cvReleaseImage(&g_image);
    cvReleaseImage(&g_gray);
    return 0;
}







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章