這是我的消除小輪廓的解決方案。 其基本思想是檢查每個輪廓的長度/面積,然後從矢量容器中刪除較小的一個。
通常你會得到這樣
Mat canny_output; //example from OpenCV Tutorial
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
Canny(src_img, canny_output, thresh, thresh*2, 3);//with or without, explained later.
findContours(canny_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0,0));
用Canny()預處理的輪廓,將得到的輪廓段,然而每個段被存儲與邊界像素作爲封閉的環。在這種情況下,你可以檢查長度並刪除小的像
for (vector<vector<Point> >::iterator it = contours.begin(); it!=contours.end();)
{
if (it->size()<contour_length_threshold)
it=contours.erase(it);
else
++it;
}
沒有坎尼()預處理,你會得到對象的輪廓。 相似,也可以使用區域來定義閾值,以消除小物件,如)所示
vector<Point> contour = contours[i];
double area0 = contourArea(contour);
此contourArea(OpenCV的教程是非零的像素數
感謝您的建議,但我沒有得到如何編寫代碼來查找已檢測到的每個斑點/輪廓的區域。我寫的代碼在以下鏈接中。你能否糾正它並回復。 :http://textuploader.com/?p=6&id=YwRl。 – 2012-04-20 02:16:39
哦!我只是忘了,cvutility的頭文件和cpp文件可以在這些鏈接中找到:http://textuploader.com/?p = 6&id = Dtnvj http://textuploader.com/?p=6&id=TSlRQ請將它們包含在源目錄和包含路徑。 – 2012-04-20 02:28:55
我對C api不太熟悉,但看起來你只是計算第一個輪廓的面積。您需要遍歷輪廓,並只繪製區域大於某個閾值的輪廓。如果你只是想找到一個物體,你應該繪製最大面積的輪廓。 – fferen 2012-04-20 03:09:34