2016-01-21 191 views
0
cv::Mat thr; 

std::vector<std::vector<cv::Point> > contours; 
std::vector<std::vector<cv::Vec4i> > hierarchy; 

int largest_area   = 0; 
int largest_contour_index = 0; 

cv::findContours(thr, contours, hierarchy,CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE); // Find the contours in the image 

for(int i = 0; i < contours.size(); i++)           // iterate through each contour. 
{ 
    double a = contourArea(contours[i], false);          // Find the area of contour 
    if(a > largest_area) 
    { 
     largest_area   = a; 
     largest_contour_index = i;             // Store the index of largest contour 
    } 

} 

找到最大輪廓的索引後該怎麼辦?如何刪除其內部區域的所有其他輪廓? 圖像是二進制的(cv :: Mat thr)。只是與白色區域的黑色背景。 謝謝。從圖像中減去除最大區域以外的所有輪廓

回答

0

在你的情況下,用其內部區域刪除輪廓等於將它們填充爲黑色。這可以通過繪製具有黑色的輪廓區域來完成:

for (size_t i=0; i<contours.size(); ++i) { 
    if (i != largest_contour_index) { // not the largest one 
     cv::drawContours(thr, contours, i, cv::Scalar(0,0,0), CV_FILLED); 
    } 
} 
+0

非常感謝!這正是我需要的。 – Pringles

0

找到輪廓後找到最大輪廓索引並在Mat上繪製該輪廓。

int indexOfBiggestContour = -1; 
int sizeOfBiggestContour = 0; 
for (int i = 0; i < contours.size(); i++) 
{ 
    if (contours[i].size() > sizeOfBiggestContour) 
    { 
     sizeOfBiggestContour = contours[i].size(); 
     indexOfBiggestContour = i; 
    } 
} 
cv::Mat newImage; 
drawContours(newImage, contours, indexOfBiggestContour, Scalar(255), CV_FILLED, 8, hierarchy); 
相關問題