幾天前,我發現了一個代碼,該代碼通過使用它們的區域對向量內的輪廓進行排序。但我無法很好地理解代碼,尤其是在比較器功能中。為什么輪廓 1&2 會在輪廓區域引數中轉換為 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];
uj5u.com熱心網友回復:
您的輸入影像是二進制的,因此它只存在 0 和 1。當您使用 cv::findContours 時,它會搜索值為 '1' 的點并接觸其他 1,這會形成一個輪廓。然后將所有輪廓放入 std::vectorstd::vector<cv::Point> 輪廓中。
當您使用一個網格并在其中繪制一個輪廓的點時,您將獲得一個二維點陣列,這基本上是一個單通道 cv::Mat。
在“compareContourAreas”中,您從矢量“輪廓”中取出兩個輪廓,并比較輪廓中所有點的絕對和。要添加使用contourArea 的所有點,它需要一個cv::Mat 作為輸入,所以首先需要將點的輪廓向量轉換為cv::Mat。
然后使用排序功能將所有輪廓從小到大排序。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/440103.html
