如何利用OPENCV的matchShapes進行輪廓匹配?
主要步驟1.讀取一幅圖片,并且對其進行二值化。2.對其進行形態學處理,減少孔洞等次要特征,保留其主要特征。3.進行邊緣提取。4.進行形狀輪廓匹配,得到其匹配值,從而判斷是否是同一個形狀。 下面是演示代碼: #include <iostream> #include "opencv2/opencv.hpp" using namespace std; using namespace cv; int main() { Mat k=imread("E:/TestGit/8.jpg",0); Mat f; Mat k1=imread("E:/TestGit/9.jpg",0); Mat f1; threshold(k,f,50,255,THRESH_BINARY);//對圖像進行二值化 threshold(k1,f1,50,255,THRESH_BINARY); Mat closerect=getStructuringElement(MORPH_RECT,Size(3,3)); //進行結構算子生成 morphologyEx(f,f,MORPH_OPEN,closerect); morphologyEx(f1,f1,MORPH_OPEN,closerect);//進行形態學開運算 Mat dst = Mat::zeros(k.rows, k.cols, CV_8UC3); Mat dst1 = Mat::zeros(k1.rows, k1.cols, CV_8UC3); vector<vector<Point>> w,w1; vector<Vec4i> hierarchy,hierarchy1 ; findContours(f,w,hierarchy,RETR_CCOMP,CHAIN_APPROX_SIMPLE);//提取輪廓元素 findContours(f1,w1,hierarchy1,RETR_CCOMP,CHAIN_APPROX_SIMPLE); FileStorage fs("f.dat",FileStorage::WRITE); fs<<"f"<<w1[0]; int idx=0; double ffff=matchShapes(w[0],w1[0],CV_CONTOURS_MATCH_I3,1.0);//進行輪廓匹配 std::cout<<ffff<<std::endl; system("pause"); return 0; } 這樣,我們就得到了輪廓邊緣的提取和匹配,滿足了需要。而不同的算子具有不同的匹配算子方法。