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