2013-03-06 104 views
2

我目前正在處理大量檢測到輪廓的圖像。 我的目標是縮小輪廓的數量,最終只有我正在尋找的輪廓。爲此我進行了一系列基於面積和邊界框的測試。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);

+0

也許你可以創建一個新的countour結構,並不斷添加那些通過你的測試。 – 2013-03-06 10:23:31

+0

它爲什麼不起作用?其餘數據在哪裏保存? – 2013-03-06 12:15:28

回答