OPENCV C++:使用面积对轮廓进行排序

OPENCV C++: Sorting contour by using their areas

几天前我发现了一个代码,它通过使用他们的 areas.But 对向量内部的轮廓进行排序,我无法很好地理解代码,尤其是在比较器函数中。为什么轮廓 1 和 2 在 contourArea 参数中转换为 Mat?任何人都可以逐步向我解释整个代码。你的解释对我的学习过程很有用

 // comparison function object
 bool compareContourAreas ( std::vector<cv::Point> contour1, std::vector<cv::Point> contour2 ) 
{
   double i = fabs( contourArea(cv::Mat(contour1)) );
   double j = fabs( contourArea(cv::Mat(contour2)) );
   return ( i < j );
}



[...]

// find contours
std::vector<std::vector<cv::Point> > contours;
std::vector<cv::Vec4i> hierarchy;
cv::findContours( binary_image, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE, 
cv::Point(0, 0) );

// sort contours
std::sort(contours.begin(), contours.end(), compareContourAreas);

// grab contours
std::vector<cv::Point> biggestContour = contours[contours.size()-1];
std::vector<cv::Point> smallestContour = contours[0];

您的输入图像是二进制的,因此它只存在 0 和 1。当您使用 cv::findContours 时,它会搜索值为“1”的点并与其他 1 相接触,从而形成轮廓。然后将所有轮廓放入 std::vectorstd::vector contours.

当您使用网格并在其中绘制一个轮廓的点时,您将得到一个二维点数组,这基本上是一个 one-channel cv::Mat.

在 'compareContourAreas' 中,您从矢量 'contours' 中取出两条轮廓,然后比较轮廓中所有点的绝对和。要添加您使用 contourArea 的所有点,它需要 cv::Mat 作为输入,因此您首先需要将 contour-vector 点转换为 cv::Mat.

然后使用排序功能将所有轮廓从小到大排序。