我目前正在處理大量檢測到輪廓的圖像。 我的目標是縮小輪廓的數量,最終只有我正在尋找的輪廓。爲此我進行了一系列基於面積和邊界框的測試。OpenCV 2.4.4中的輪廓/連接組件
現在我在每一步之後都會執行一個drawContours
來表示我想保留的輪廓,然後是findContours
。
我的問題是,我只想做findContours
一次,然後只是抹掉我不想要的輪廓,這可能嗎?
電流方式:
Mat src;
Mat BW;
src = imread("img.bmp", 0);
if(src.channels() > 1)
{
cvtColor(src, src, CV_BGR2GRAY);
}
threshold(src, BW, 100, 255, CV_THRESH_OTSU);
imshow("Tresh", BW);
Mat dst = Mat::zeros(src.rows, src.cols, CV_8UC3);
Mat dstP = Mat::zeros(src.rows, src.cols, CV_8UC3);
Mat dst1 = Mat::zeros(src.rows, src.cols, CV_8UC3);
Mat dst2 = Mat::zeros(src.rows, src.cols, CV_8UC3);
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
findContours(BW, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE);
for(int i = 0; i < contours.size(); i++)
{
Scalar color(rand()&255, rand()&255, rand()&255);
drawContours(dst, contours, i, color, 2/*CV_FILLED*/, 8, hierarchy);
}
/// Test on area ******************************************************************
for(int i = 0; i < contours.size(); i++)
{
if (contourArea(contours[i], false) > 100 && contourArea(contours[i], false) < 200000)
{
Scalar color(rand()&255, rand()&255, rand()&255);
drawContours(dst1, contours, i, color, CV_FILLED, 8, hierarchy);
}
}
/// Next test **********************************************************************
cvtColor(dst1, dstP, CV_BGR2GRAY);
findContours(dstP, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE);
等
通緝方式:
if (contourArea(contours[i], false) < 100 && contourArea(contours[i], false) > 200000)
{
contours.erase(i); // Doesn't work
}
有誰現在怎麼抹去那些輪廓? PS:我不關心內部輪廓,我希望所有人都能通過我的測試。
編輯,該溶液(limonana指出的)是:contours.erase(contours.begin()+i);
也許你可以創建一個新的countour結構,並不斷添加那些通過你的測試。 – 2013-03-06 10:23:31
它爲什麼不起作用?其餘數據在哪裏保存? – 2013-03-06 12:15:28