网站开发旅游前台模板,网站结构怎么做,seo工具优化软件,线下推广的方式有哪些今天在弄一个查找连通的最大面积的问题。要把图像弄成黑底#xff0c;白字#xff0c;这样才可以正确找到。然后调用下边的方法#xff1a;RETR_CCOMP:提取所有轮廓#xff0c;并将轮廓组织成双层结构(two-level hierarchy),顶层为连通域的外围边界#xff0c;次层位内层边…今天在弄一个查找连通的最大面积的问题。要把图像弄成黑底白字这样才可以正确找到。然后调用下边的方法RETR_CCOMP:提取所有轮廓并将轮廓组织成双层结构(two-level hierarchy),顶层为连通域的外围边界次层位内层边界#include #include using namespace cv;using namespace std;int main( int argc, char** argv ){Mat src imread( argv[1] );int largest_area0;int largest_contour_index0;Rect bounding_rect;Mat thr;cvtColor( src, thr, COLOR_BGR2GRAY ); //Convert to graythreshold( thr, thr, 125, 255, THRESH_BINARY ); //Threshold the graybitwise_not(thr,thr); //这里先变反转颜色vector contours; // Vector for storing contoursfindContours( thr, contours, RETR_CCOMP, CHAIN_APPROX_SIMPLE ); // Find the contours in the imagefor( size_t i 0; i contours.size(); i ) // iterate through each contour.{double area contourArea( contours[i] ); // Find the area of contourif( area largest_area ){largest_area area;largest_contour_index i; //Store the index of largest contourbounding_rect boundingRect( contours[i] ); // Find the bounding rectangle for biggest contour}}drawContours( src, contours,largest_contour_index, Scalar( 0, 255, 0 ), 2 ); // Draw the largest contour using previously stored index.imshow( result, src );waitKey();return 0;}方法二 connectedComponentsWithStatsstd::pair int , int MaxAreaFromSource(Mat srcImage, Mat dstImage, int index){/*vector contours; // Vector for storing contoursint largest_area0;size_t largest_contour_index0;Rect bounding_rect;findContours( srcImage, contours, RETR_CCOMP, CHAIN_APPROX_SIMPLE ); // Find the contours in the imagefor( size_t i 0; i contours.size(); i ) // iterate through each contour.{double area contourArea( contours[i] ); // Find the area of contourif( area largest_area ){largest_area area;largest_contour_index i; //Store the index of largest contourbounding_rect boundingRect( contours[i] ); // Find the bounding rectangle for biggest contour}}Mat dst;cvtColor(srcImage, dst, CV_GRAY2RGB);drawContours( dst, contours,largest_contour_index, Scalar( 0, 255, 0 ), 2 ); // Draw the largest contour using previously stored index.imshow( result, dst );waitKey();printf(%%%%%%%%%%%max area:%d\n, largest_area);return make_pair( largest_area, index);*/cv::Mat img_bool, labels, stats, centroids, img_color, img_gray;//连通域计算int nccomps cv::connectedComponentsWithStats (srcImage, //二值图像labels, //和原图一样大的标记图stats, //nccomps×5的矩阵 表示每个连通区域的外接矩形和面积(pixel)centroids //nccomps×2的矩阵 表示每个连通区域的质心);//cv::imshow(labels, labels);//cv::waitKey();vector:vec3b colors(nccomps);colors[0] cv::Vec3b(0,0,0); // background pixels remain black.printf( index:%d\n,index );vector int vec_width,vec_area,vec_height;for(int label 1; label nccomps; label){colors[label] cv::Vec3b( (std::rand()255), (std::rand()255), (std::rand()255) );std::cout Component label std::endl;std::cout CC_STAT_LEFT stats.at(label,cv::CC_STAT_LEFT) std::endl;std::cout CC_STAT_TOP stats.at(label,cv::CC_STAT_TOP) std::endl;std::cout CC_STAT_WIDTH stats.at(label,cv::CC_STAT_WIDTH) std::endl;std::cout CC_STAT_HEIGHT stats.at(label,cv::CC_STAT_HEIGHT) std::endl;std::cout CC_STAT_AREA stats.at(label,cv::CC_STAT_AREA) std::endl;std::cout CENTER ( centroids.at(label, 0) (label, 1) ) std::endl std::endl;int area stats.at(label,cv::CC_STAT_AREA);int left stats.at(label,cv::CC_STAT_LEFT);int top stats.at(label,cv::CC_STAT_TOP);int width stats.at(label,cv::CC_STAT_WIDTH);int height stats.at(label,cv::CC_STAT_HEIGHT);vec_area.push_back(area);vec_width.push_back(width);vec_height.push_back(height);}vector::iterator bigwidth std::max_element(std::begin(vec_width), std::end(vec_width));vector::iterator bigheight std::max_element(std::begin(vec_height), std::end(vec_height));vector::iterator bigarea std::max_element(std::begin(vec_area), std::end(vec_area));//printf( area:%d------------width:%d height:%d \n, *bigarea, *bigwidth, *bigheight );//按照label值对不同的连通域进行着色img_color cv::Mat::zeros(srcImage.size(), CV_8UC3);for( int y 0; y img_color.rows; y )for( int x 0; x img_color.cols; x ){int label labels.at(y, x);CV_Assert(0 label label nccomps);img_color.at:vec3b(y, x) colors[label];}cv::imshow(color, img_color);cv::waitKey();return make_pair( *bigarea , index );}我先用这个函数实现了一下效果正确还是opencv demo 是正确的网上找了个例子害死我了。说明一下方法一 比 第二种方法 运行速度快很多哦 这一点很重要。以上这篇opencv 查找连通区域 最大面积实例就是小编分享给大家的全部内容了希望能给大家一个参考也希望大家多多支持随便开发网。