OpenCV计算连通区域数目与最大连通区域并标示出

#include <stdio.h>
#include <cv.h>
#include <highgui.h>

#pragma comment(lib, "cv.lib")
#pragma comment(lib, "cxcore.lib")
#pragma comment(lib, "highgui.lib")

int main( int argc, char** argv )
{
	IplImage* src = cvLoadImage(".\\wind.png", CV_LOAD_IMAGE_GRAYSCALE);
	IplImage* dst = cvCreateImage(cvGetSize(src), 8, 3);
	CvMemStorage* storage = cvCreateMemStorage(0);
	CvSeq* contour = 0;
	cvThreshold(src, src,120, 255, CV_THRESH_BINARY);	// 二值化
	cvNamedWindow("Source", 1);
	cvShowImage("Source", src);
	// 提取轮廓
	int contour_num = cvFindContours(src, storage, &contour, sizeof(CvContour), CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE);
	cvZero(dst);		// 清空数组
	CvSeq *_contour = contour;
	double maxarea = 0;
	double minarea = 100;
	int m = 0;
	for( ; contour != 0; contour = contour->h_next )
	{  

		double tmparea = fabs(cvContourArea(contour));
		if(tmparea < minarea)
		{
			cvSeqRemove(contour, 0); // 删除面积小于设定值的轮廓
			continue;
		}
		CvRect aRect = cvBoundingRect( contour, 0 );
		if ((aRect.width/aRect.height)<1)
		{
			cvSeqRemove(contour, 0); //删除宽高比例小于设定值的轮廓
			continue;
		}
		if(tmparea > maxarea)
		{
			maxarea = tmparea;
		}
		m++;
		// 创建一个色彩值
		CvScalar color = CV_RGB( 0, 255, 255 );

		//max_level 绘制轮廓的最大等级。如果等级为0,绘制单独的轮廓。如果为1,绘制轮廓及在其后的相同的级别下轮廓
		//如果值为2,所有的轮廓。如果等级为2,绘制所有同级轮廓及所有低一级轮廓,诸此种种
		//如果值为负数,函数不绘制同级轮廓,但会升序绘制直到级别为abs(max_level)-1的子轮廓
		cvDrawContours(dst, contour, color, color, -1, 1, 8);	//绘制外部和内部的轮廓
	}
	contour = _contour;
	int count = 0;
	for(; contour != 0; contour = contour->h_next)
	{
		count++;
		double tmparea = fabs(cvContourArea(contour));
		if (tmparea == maxarea)
		{
			CvScalar color = CV_RGB( 255, 0, 0);
			cvDrawContours(dst, contour, color, color, -1, 1, 8);
		}
	}
	printf("The total number of contours is:%d", count);
	cvNamedWindow("Components", 1);
	cvShowImage("Components", dst);
	cvWaitKey(0);
	cvDestroyWindow("Source");
	cvReleaseImage(&src);
	cvDestroyWindow("Components");
	cvReleaseImage(&dst);

	return 0;
}  

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!希望你也加入到我们人工智能的队伍中来!https://www.cnblogs.com/captainbed

原文地址:https://www.cnblogs.com/sownchz/p/10148539.html

时间: 2024-10-08 14:48:32

OpenCV计算连通区域数目与最大连通区域并标示出的相关文章

使用OpenCV查找二值图中最大连通区域

http://blog.csdn.net/shaoxiaohu1/article/details/40272875 使用OpenCV查找二值图中最大连通区域 标签: OpenCVfindCoutours 2014-10-19 22:31 2802人阅读 评论(0) 收藏 举报  分类: 图像与OpenCV(15)  版权声明:本文为shaoxiaohu原创文章,欢迎转载,请注明出处,谢谢. 上一篇博文中介绍了matlab查找最大连通区域的方法,OpenCV函数中也有类似的函数与之对应,findC

OpenCV 计算区域的内部参数

对于一个区域,怎么进一步针对区域内部特征进行处理呢 ? 首先,我们要提取出来内部的某些特征才能说话,下面提取一些简单的特征,话不多说见代码: 1.平均数及方差参数: 1 Mat tempMean, tempStddv; 2 double MEAN, STDDV;// mean and standard deviation of the flame region 3 double m = mean(flameRectRegion)[0]; 4 //cout << "mean="

Giraph源码分析(八)—— 统计每个SuperStep中参与计算的顶点数目

[题目] 原文: 1.3 Design an algorithm and write code to remove the duplicate characters in a string without using any additional buffer. NOTE: One or two additional variables are fine. An extra copy of the array is not. FOLLOW UP Write the test cases for

opencv计算矩阵与数值的乘积,矩阵与矩阵的乘积

1.矩阵与数值的乘积 在进行数组与一个常量相乘的运算时,使用了Mat类中的mul函数. //! per-element matrix multiplication by means of matrix expressions MatExpr mul(InputArray m, double scale=1) const; 使用后,发现数据有些异常,于是就打印出每一个计算后的数值, 发现原来该函数是将,m中矩阵每个元素先做二次方运算,再与scale相乘,于是放弃用该函数,改用 //! comput

笔记 OSPF多区域配置 STUB区域 路由重分发 NSSA区域配置

主题:OSPF 多区域配置 ABR:area border router ,区域边界路由器 -作用 实现不同区域之间的互通: -定义 同时连接骨干区域和非骨干区域的路由器: OSPF为什么会引入/划分区域? 划分区域以后,可以带来以下好处: 1.节省区域中的每一个设备的系统资源 (大区域被划分以后,小区域中的数据库内容就会变少) (同一个区域中的所有的路由器,数据库是完全相同) 2.增强 OSPF 网络的稳定性 (一个不稳定链路造成的不良影响,仅在同一个区域) (中传播,不会影响到其他区域) 验

Linux学习之路之DNS的配置文件和正解区域文件、反解区域文件

DNS正解区域文件 在DNS中,我们知道有域和区域的概念,域的英文名称是domain,它是一种逻辑概念:而区域英文全称zone,它是一种物理概念.且zone分为正解区域和反解区域 正解区域:提供正向解析的服务,即FQDN-->IP的过程 反解区域:提供反向解析的服务,即IP-->FQDN的过程 不管好似正解区域还是反解区域,都通过了一个配置文件,这个文件中的每一个条目就是一个资源记录(Resource Record,RR). 资源记录的类型主要有这些,且这些资源记录的格式为: SOA:起始授权

OpenCV统计米粒数目-计算联通区域的个数及联通区域内像素的个数

分享一下我老师大神的人工智能教程吧.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net 基于对话框的程序. 实现界面: 打开图片的消息响应函数: void CcountRiceDlg::OnBnClickedOpen() { // TODO: 在此添加控件通知处理程序代码 TCHAR szFilters[]=_T("BMP Files (*.bmp)|*.png|All Files (*.*)|*.*||")

nyoj27-水池数目 (求连通块数目)【dfs】

http://acm.nyist.net/JudgeOnline/problem.php?pid=27 水池数目 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地图上仅标识了此处是否是水池,现在,你的任务来了,请用计算机算出该地图中共有几个水池. 输入 第一行输入一个整数N,表示共有N组测试数据每一组数据都是先输入该地图的行数m(0<m<100)与列数n(0

NYOJ27.水池数目-DFS求连通块

水池数目 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地图上仅标识了此处是否是水池,现在,你的任务来了,请用计算机算出该地图中共有几个水池. 输入 第一行输入一个整数N,表示共有N组测试数据每一组数据都是先输入该地图的行数m(0<m<100)与列数n(0<n<100),然后,输入接下来的m行每行输入n个数,表示此处有水还是没水(1表示此处是水池