❶ opencv中使用findContours、contourArea的問題。
blur(imgGray,imgGray,Size(3,3)); 執行到這句的時候圖形的像素排列就已經改變了,旋轉之後看著雖然差不多,但是已經不同了。
如果要精確的面積,必須要計算像素。
❷ openCV里怎麼求二值化圖像的面積和輪廓周長
可以先用findContours()函數找到你需要的輪廓,然後用contourArea()函數求面積,用arcLength()函數求輪廓長度,也就是周長。
❸ 怎麼用opencv在輸入的原圖上面已經尋找出來的輪廓
二值化,然後用countour那個函數就可以得到物體的輪廓。
❹ 如何利用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;
}
這樣,我們就得到了輪廓邊緣的提取和匹配,滿足了需要。而不同的運算元具有不同的匹配運算元方法。
❺ opencv提取工件輪廓
這么說吧,人眼能分出來,那麼理論上說,演算法也應該能分出來。你可以試試區域分割方法試試。或者使用先驗知識,例如你現在檢測到輪廓中的內凹的兩個角。