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.
然后使用排序功能将所有轮廓从小到大排序。
几天前我发现了一个代码,它通过使用他们的 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
当您使用网格并在其中绘制一个轮廓的点时,您将得到一个二维点数组,这基本上是一个 one-channel cv::Mat.
在 'compareContourAreas' 中,您从矢量 'contours' 中取出两条轮廓,然后比较轮廓中所有点的绝对和。要添加您使用 contourArea 的所有点,它需要 cv::Mat 作为输入,因此您首先需要将 contour-vector 点转换为 cv::Mat.
然后使用排序功能将所有轮廓从小到大排序。