opencv 最大连通域_opencv 查找连通区域 最大面积实例

今天在弄一个查找连通的最大面积的问题。

要把图像弄成黑底,白字,这样才可以正确找到。

然后调用下边的方法:

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_area=0;

int largest_contour_index=0;

Rect bounding_rect;

Mat thr;

cvtColor( src, thr, COLOR_BGR2GRAY ); //Convert to gray

threshold( thr, thr, 125, 255, THRESH_BINARY ); //Threshold the gray

bitwise_not(thr,thr); //这里先变反转颜色

vector > contours; // Vector for storing contours

findContours( thr, contours, RETR_CCOMP, CHAIN_APPROX_SIMPLE ); // Find the contours in the image

for( size_t i = 0; i< contours.size(); i++ ) // iterate through each contour.

{

double area = contourArea( contours[i] ); // Find the area of contour

if( area > largest_area )

{

largest_area = area;

largest_contour_index = i; //Store the index of largest contour

bounding_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;

}

方法二: connectedComponentsWithStats

std::pair< int , int > MaxAreaFromSource(Mat srcImage, Mat &dstImage, int index)

{

/*

vector > contours; // Vector for storing contours

int largest_area=0;

size_t largest_contour_index=0;

Rect bounding_rect;

findContours( srcImage, contours, RETR_CCOMP, CHAIN_APPROX_SIMPLE ); // Find the contours in the image

for( size_t i = 0; i< contours.size(); i++ ) // iterate through each contour.

{

double area = contourArea( contours[i] ); // Find the area of contour

if( area > largest_area )

{

largest_area = area;

largest_contour_index = i; //Store the index of largest contour

bounding_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 查找连通区域 最大面积实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持随便开发网。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/258434.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JS 函数柯里化

在计算机科学中&#xff0c;柯里化是把接受多个参数的函数变换成接受一个单一参数&#xff08;最初函数的第一个参数&#xff09;的函数&#xff0c;并且返回接受余下的参数而且返回结果的新函数的技术。——详见 维基百科柯里化就是预先将某些参数传入&#xff0c;得到一个简单…

LTI系统的物理可实现性与希尔伯特变换

产品的设计一般为线性时不变系统&#xff0c;要求系统具有物理可实现性&#xff0c;从时域上看&#xff0c;h(t)具有因果性&#xff1b;从频域上看&#xff0c;|H(jw)|符合佩利—维纳准则。任何具有因果性的系统&#xff0c;|H(jw)|的实部R(w)满足希尔伯特变换&#xff0c;|H(j…

垂死挣扎还是涅槃重生 -- Delphi XE5 公布会归来感想

Delphi 是一个基本上被我遗忘的工具&#xff0c; 要不是在使用RapidSql , 我是收不到Embarcadero 公司发出的邀请来參加Delphi XE5的公布会的。 有人可能要问为什么是Embarcadero &#xff08;名称很拗口&#xff09;而不是Borland 开Delphi 公布会&#xff0c; 这是由于Borla…

iOS Appstore 版本更新

1&#xff0c;版本更新 通过比较构建号/版本号 检查更新 /// 构建号 50 // NSString * currentVersion [NSBundle mainBundle].infoDictionary["CFBundleVersion"];/// 版本号 2.2.0//CFBundleShortVersionStringNSString * currentVersion [NSBundle mainBund…

ubuntu下安装国际版QQ

在网上看到了好多的ubuntu下安装QQ的方法 好多 下面是看别人的文章 来测试的一篇 ubuntu下 安装国际版QQhttp://www.ubuntukylin.com/applications/showimg.php?langcn&id23下载 地址网盘:http://yun.baidu.com/share/link?shareid2983202140&uk202032639下载好以后 …

傅里叶变换应用——信号调制与解调

傅里叶变换的典型应用主要用于通信的信号调制与解调&#xff0c;信号调制的目的是将信号进行变换&#xff0c;使其便于传输。频率调制是将低频信号调制到高频载波信号上。同步信号解调是接受系统产生同步的高频载波信号进行解调&#xff0c;从调制信号中恢复原信号的过程。调制…

cocos2d-x返回Android游戏黑屏解决办法

返回Android游戏黑屏解决办法这几天逛cocos2d-x.org论坛&#xff0c;发现cocos2d-x的作者放出来一个帖子&#xff0c;用来解决返回Android游戏加载资源时黑屏的问题。帖子过些日子估计就沉了&#xff0c;所以转出来&#xff0c;以供后面查询。需要修改三个文件&#xff1a;1) c…

vue重要特性

重要特性 自定义input组件动态组件递归组件slot作用域slot异步组件内联模板子组件索引进阶 自定义指令状态管理vuex单文件组件生产部署路由xxx

连续时间系统与离散时间系统的时域分析对比

通过学习离散时间系统的时域分析&#xff0c;发现其与连续时间系统的时域分析有很多相似之处&#xff0c;自己做了一个专题拓展&#xff0c;从数学模型描述到时域分析方法对两大系统进行横向对比&#xff0c;总结两者之间的联系和异同点。

python获取当前时间的源代码_Python获取时间戳代码实例

1、获取秒级时间戳与毫秒级时间戳、微秒级时间戳import timeimport datetimet time.time()print (t) #原始时间数据print (int(t)) #秒级时间戳print (int(round(t * 1000))) #毫秒级时间戳print (int(round(t * 1000000))) #微秒级时间戳返回1499825149.257892 #原始时间数据…

AutoLayout bug集合

NSInternalInconsistencyException, reason: <NSISEngine: 0x16d5ef10>... http://stackoverflow.com/questions/28111635/ios-aspect-ratio-constraint-breaks-on-ios7-works-on-ios8 这好像是ios7.1的bug,对浮点数计算有误,一般添加按钮比例约束的时候multiplier值都是…

[SQL Server]重命名数据库【转】

原文链接&#xff1a;http://www.cnblogs.com/Ryan_j/archive/2011/04/03/2004428.html 重命名数据库很简单&#xff0c;选择数据库--右键--重命名数据库 或者 sp_renamedb oldDB ,newDB 但是你再新建的相同名字的数据库就会报错&#xff0c;提示数据库已经存在 比如test数据库…

DCOS实践分享(4):如何基于DC/OS整合SMACK(Spark, Mesos, Akka, Cassandra, Kafka)

这篇文章入选CSDN极客头条 http://geek.csdn.net/news/detail/71572 当前&#xff0c;要保证业务的市场竞争力&#xff0c;仅靠设计一个可用并且好看的产品&#xff0c;已经完全不能满足要求。全球消费者都希望产品能够足够的智能化&#xff0c;通过大数据分析来改善他们的用户…

连续系统的卷积积分与离散系统的卷积和

在LTI连续系统中&#xff0c;以冲激函数为基本信号&#xff0c;将任意信号分解&#xff0c;从而得到连续系统的零状态响应等于激励与系统冲激响应的卷积积分 &#x1d466;&#x1d467;&#x1d460;&#x1d461;&#x1d453;&#x1d461;∗h&#x1d461; 在LTI离散…

自学python从零开始学_新手学习python-从零开始学习

1.学习pythonurllib2 常用方法urlopen(url, data, timeout)urllib2.Request()urllib.urlencode()params {}get : url "?" paramshttp:请求分析User-Agent : 有些服务器或 Proxy 会通过该值来判断是否是浏览器发出的请求Content-Type : 在使用 REST 接口时&#x…

【数据结构】图的深度优先搜索

图的深度优先搜索类似于树的深度优先搜索。不同的是&#xff0c;图中可能包括循环&#xff0c;即我们有可能重复访问节点。为了避免访问已经访问过的节点&#xff0c;我们要使用一个布尔变量的数组。 例如&#xff0c;在下图中&#xff0c;我们从节点2开始访问。当访问到节点0&…

flex中dispatchEvent的用法(自定义事件) .

Evevt和EventDispatcher类在as3的事件机制中是很重要的角色&#xff0c;dispatchEvent()是EventDispatcher类的一个事件发送方法&#xff0c;它可以发送出Event类或其子类的实例&#xff0c;在as3中所有的显示对象都可以发送事件&#xff0c;因为as3中所有的显示对象都是EventD…

菜鸟超级进口大仓618首度亮相!跨境商品也能当日次日达

6月12日下午3点40分&#xff0c;来自南京的一名用户收到了由宁波保税仓发出、圆通速递配送的雀巢咖啡&#xff0c;这距离他在天猫国际上下单仅过去4小时。 天猫618在昨日迎来进口日&#xff0c;进口销量火爆上升。作为国内最为先进的跨境进口仓&#xff0c;菜鸟超级大仓在本次大…

频域/s域/z域三大变换的发展史及其联系

本文主要介绍三大变换&#xff08;傅里叶变换、拉普拉斯变换及Z变换&#xff09;的发展史及其之间的联系。

Tomcat8.0.21登录时忘记用户名和密码

大概是这学期开学没多久吧&#xff0c;4月份的时候&#xff0c;为了学习javaEE&#xff0c;装了Tomcat。过了这么久早就忘记用户名和密码了&#xff0c;所以无法进入Tomcat的管理界面。百度&#xff08;其实我也很想用google&#xff09;了一堆&#xff0c;几乎都是修改用户配置…