01 找輪廓

    輪廓(findContours、drawContours)

    當我們做物件辨識時,透過輪廓可得到特定物件的資訊,協助我們做判斷,OpenCV的findContours()函式可找到影像的輪廓,依實際需求調整參數輸入,而這邊的輪廓和Sobel這些找邊緣的處理不同,Sobel是將物件內部消除,只保留物件邊緣,findContours是在經過Sobel處理之後,將這個只有邊緣的影像,把各個邊緣點做分類,連結的邊緣點儲存在同個容器內,當我們找到輪廓後,可用drawContours()劃出輪廓線,檢查是否取得正確或適合的輪廓。

    screen-shot-2016-11-14-at-12-50-45-am

    #include <iostream>
    #include <opencv2/core/core.hpp> 
    #include <opencv2/highgui/highgui.hpp>
    #include <opencv2/opencv.hpp>
    
    using namespace cv ;
    using namespace std ;
    
    int main() {
        cv::Mat src = cv::imread("/Users/powenko/Desktop/1.png");
        if(src.data!=NULL){
            
            Mat src_gray = imread("/Users/powenko/Desktop/1.png", CV_LOAD_IMAGE_GRAYSCALE);
            Mat contoursImg = src.clone();
            Mat edge;
            blur(src_gray, src_gray, Size(3,3));
            Canny(src_gray, edge, 50, 150, 3);
            
            vector<vector<Point>> contours;
            vector<Vec4i> hierarchy;
            RNG rng(12345);
            findContours(edge, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_NONE);
            for(int i = 0; i<contours.size(); i++){
                Scalar color = Scalar( rng.uniform(0, 255), rng.uniform(0, 255), 255);
                drawContours(contoursImg, contours, i, color, 2, 8, hierarchy);
            }
            
            cv::namedWindow("Image") ;
            cv::imshow("Image", src) ;
            cv::imshow("Powenko.com  result", contoursImg) ;
            cv::waitKey() ;
        }
        return 0;
    }