我正在使用OpenCV生成和排序轮廓。我需要按区域及其相关层次结构(CV_RETR_TREE)对轮廓进行排序。我已经设法使用std :: sort方法优雅地对轮廓进行排序,但是,由于层次结构和轮廓不存储记录号(据我所知),我无法找到将两个数据库关联在一起进行排序的方法。所以这意味着在对轮廓进行排序后,我的层次结构变得无效在排序之前,我显然可以使用记录号填充其他数据库,但是有人可以建议更好的解决方案吗?
搜索网络毫无结果,因为OpenCV轮廓的每个结果实际上也包含层次结构。
void myContourFunction(Mat srcImage) {
vector<Vec4i> hierarchy;
vector<vector<cv::Point> > contours;
findContours(srcImage, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_NONE, cv::Point(0,0));
vector<vector<cv::Point> > contoursPoly( contours.size() );
for( int i = 0; i < numberContours; i++ ) {
approxPolyDP( Mat(contours[i]), contoursPoly[i], 0.8, true );
}
std::sort(contoursPoly.begin(), contoursPoly.end(), compareContourAreas);
}
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 );
}