OpenCv的连通域操作

由于项目需要,要对图像中的最大连通域进行标定,并且存储。首先需要使用cvFindCountour对边缘进行标定,其实它的原理就是连通域的边缘提取;其次就是对连通域进行大小判断找出最大的连通域;最后当然就是进行Rect并且ROI了。如果有需要可以进行存储。直接上源码吧。

#include "cv.h"#include "cxcore.h"#include "highgui.h" int main( int argc, char** argv )//声明IplImage指针 IplImage* pImg = cvLoadImage("black.bmp",0); IplImage* pContourImg = NULL; CvMemStorage * storage = cvCreateMemStorage(0); CvSeq * contour = 0; CvSeq *contmax = 0int mode = CV_RETR_EXTERNAL; cvShowImage( "src", pImg ); //为轮廓显示图像申请空间 //3通道图像,以便用彩色显示 pContourImg = cvCreateImage(cvGetSize(pImg),  IPL_DEPTH_8U,  3); //copy source image and convert it to BGR image cvCvtColor(pImg, pContourImg, CV_GRAY2BGR); //查找contour cvFindContours( pImg, storage, &contour, sizeof(CvContour),  mode, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0)); //将轮廓画出    cvDrawContours(pContourImg, contour,  CV_RGB(255,0,0), CV_RGB(255, 0, 0),  2, 2, 8, cvPoint(0,0)); int area,maxArea = 10;//设面积最大值大于10Pixel for(;contour;contour = contour->h_next) {  area = fabs(cvContourArea( contour, CV_WHOLE_SEQ )); //获取当前轮廓面积  printf("area == %lf\n", area);  if(area > maxArea)  {   contmax = contour;   maxArea = area;  } } CvRect aRect = cvBoundingRect( contmax, 0 ); cvSetImageROI( pContourImg,aRect); //显示图像 cvShowImage( "contour", pContourImg ); cvSaveImage("contour.bmp",pContourImg); cvWaitKey(0); //销毁窗口 cvDestroyWindow( "src" ); cvDestroyWindow( "contour" ); //释放图像 cvReleaseImage( &pImg ); cvReleaseImage( &pContourImg ); cvReleaseMemStorage(&storage); return 0;}

处理前的连通域

处理后的连通域

  1. a. 二值化  
  2. b. 得到轮廓的个数  
  3. c. 将面积小于100的轮廓删除  
  4. d. 将宽、高 比例小于1的轮廓删除  
  5. e. 把面积最大的米粒用红色框框画出来  
#include <stdio.h>#include <cv.h>#include <cxcore.h>#include <highgui.h>#pragma comment(lib, "ml.lib")#pragma comment(lib, "cv.lib")#pragma comment(lib, "cvaux.lib")#pragma comment(lib, "cvcam.lib")#pragma comment(lib, "cxcore.lib")#pragma comment(lib, "cxts.lib")#pragma comment(lib, "highgui.lib")#pragma comment(lib, "cvhaartraining.lib")int main( int argc, char** argv )  {   IplImage* src;   src=cvLoadImage("black.jpg",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 );   //提取轮廓    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 n=-1,m=0;//n为面积最大轮廓索引,m为迭代索引    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;     n=m;    }    m++;    //  CvScalar color = CV_RGB( rand()&255, rand()&255, rand()&255 );//创建一个色彩值     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 k=0;*/   int count=0;   for( ; contour != 0; contour = contour->h_next )   {    count++;    double tmparea=fabs(cvContourArea(contour));    if (tmparea==maxarea /*k==n*/)    {     CvScalar color = CV_RGB( 255, 0, 0);     cvDrawContours( dst, contour, color, color, -1, 1, 8 );    }    /*k++;*/   }   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://blog.csdn.net/jiangjunshow

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

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

相关文章

DAY5网络

1.用select实现TCP客户端程序 #include <head.h> #define PORT 9999 // 服务器端口号 #define IP "192.168.125.74" // 服务器IP地址#define CIP "192.168.125.74" // 客户端 #define CPORT 6666int main(int argc, const char* argv[]) {// 创建套…

pyCharm最新2018激活码

最近开始研究python&#xff0c;因公司需要获取一些数据&#xff0c;比如电影名&#xff0c;航班名&#xff0c;航班号&#xff0c;列车号等等。所以让我来做一个爬虫去获取数据。所以我们就从这篇博文开始吧&#xff01;&#xff01;&#xff01; 首先告诉大家激活方式&#x…

提高电脑反应速度_设计师笔记本电脑推荐——视觉系ThinkBook 15p创造本

说到设计师笔记本电脑推荐&#xff0c;非近期大热的高颜值、高性能、更出彩的ThinkBook 15p创造本莫属了。作为专为时尚青年量身定做的品牌系列&#xff0c;ThinkBook一直都以“锐意破局”、“以思考重构世界”的理念征服着广大优秀的年轻创意用户&#xff0c;此次推出的全新产…

C语言 system函数

Windows函数windows操作系统下system () 函数详解&#xff08;主要是在C语言中的应用&#xff09; 函数名&#xff1a; system功 能&#xff1a; 发出一个DOS命令用 法&#xff1a; int system(char *command);system函数已经被收录在标准c库中&#xff0c;可以直接调用程序例…

javascript option 菜单图标_MacBook上神奇的Option键

不知道昨天的(Mac上Command键的妙用)有没有帮助到大家呢&#xff1f;今天我们就来讲一讲Mac上的Option键。Option作为Mac上四大控制键(Shift&#xff0c;Command&#xff0c;Control&#xff0c;Option)之一&#xff0c;Option在单独使用的情况下&#xff0c;很多时候是发挥调出…

OpenCV中cvResize函数图象放缩

图像大小变换void cvResize( const CvArr* src, CvArr* dst, int interpolationCV_INTER_LINEAR );src&#xff1a;输入图像. dst&#xff1a;输出图像. interpolation&#xff1a;差值方法: • CV_INTER_NN - 最近邻差值, • CV_INTER_LINEAR - 双线性差值 (缺省使用) • CV_…

学生电脑哪个牌子好_家用医用酒精棉球哪个牌子好,酒精棉片哪个牌子好

酒精制品是现在生活中常用的消毒剂&#xff0c;包括酒精消毒液、酒精洗手液、酒精喷雾剂、酒精湿巾、酒精棉球和酒精棉片等。这些酒精制品各有各的作用&#xff0c;市面上的品牌也比较多。下面就来介绍家用医用酒精棉球哪个牌子好。1、家用医用酒精棉球哪个牌子好目前在市面上使…

OpenCV图像的轮廓的匹配

一个跟轮廓相关的最常用到的功能是匹配两个轮廓.如果有两个轮廓,如何比较它们;或者如何比较一个轮廓和另一个抽象模板.矩比较两个轮廓最简洁的方式是比较他们的轮廓矩.这里先简短介绍一个矩的含义.简单的说,矩是通过对轮廓上所有点进行积分运算(或者认为是求和运算)而得到的一个…

Java Servlet 过滤器与 springmvc 拦截器的区别?

前言&#xff1a;在工作中&#xff0c;遇到需要记录日志的情况&#xff0c;不知道该选择过滤器还是拦截器&#xff0c;故总结了一下。 servlet 过滤器 定义 java过滤器能够对目标资源的请求和响应进行截取。过滤器的工作方式分为四种 应用场景 可以通过 doFilter 方法的 reques…

surface pro 6 黑苹果_微软Surface新款超薄触控笔抢鲜评测

微软Surface新款超薄触控笔抢鲜评测中文名&#xff1a;微软 Surface 超薄触控笔英文名&#xff1a;Surface Slim Pen日文名&#xff1a;Surface スリム ペン颜色&#xff1a;典雅黑&#xff08;只有这一个颜色&#xff09;中文官方链接&#xff1a;https://www.microsoftstore.…

java轻松实现无锁队列

1、什么是无锁(Lock-Free)编程 当谈及 Lock-Free 编程时&#xff0c;我们常将其概念与 Mutex(互斥) 或 Lock(锁) 联系在一起&#xff0c;描述要在编程中尽量少使用这些锁结构&#xff0c;降低线程间互相阻塞的机会&#xff0c;以提高应用程序的性能。类同的概念还有 "Lock…

numpy数组按某一维度相加_Python数据分析之NumPy(高级篇)

​一些更高级的ndarray处理where和一些其他的逻辑运算np.where(cond,x,y)&#xff1a;满足条件(cond)输出x&#xff0c;不满足输出yx_arr np.array([1.1, 1.2, 1.3, 1.4, 1.5])y_arr np.array([2.1, 2.2, 2.3, 2.4, 2.5])cond np.array([True, False, True, True, False])pr…

md5与des算法有何不同_到底AI芯片和传统芯片有何区别?

前两天成立仅两年国内专做人工智能FPGA加速算法的初创公司深鉴科技被国际巨头赛灵思收购了&#xff0c;在业界引起不小的震动。目前国内做AI芯片的公司可谓不少了&#xff0c;AI芯片已然成为了当下芯片行业最热领域。但是大部分人对AI芯片的架构应该都不是太了解。那么AI 芯片和…

Active Directory PowerShell模块收集AD信息

0x00 前言简介 Microsoft为Windows Server 2008 R2&#xff08;以及更高版本&#xff09;提供了多个Active Directory PowerShell cmdlet&#xff0c;这大大简化了以前需要将涉及到的ADSI冗长代码行放在一起的任务。 在Windows客户端上&#xff0c;需要安装远程服务器管理工具&…

anaconda对应python版本_Python基础——如何查看python版本、如何查看多个python版本

前言初学者来说&#xff0c;安装python过程是存在一定难度的。在安装过程中&#xff0c;可能安装了多个python版本&#xff0c;可能安装了anaconda导致有自带的python&#xff0c;同时本身电脑也安装了官方下载的python也茫然不知。导致可能有以下情况发生&#xff1a;1.pip in…

MATLAB统计与回归

11.1 前言統計的技巧與資料分析常常形影不離。一般統計使用加法、累加法、平均值&#xff0c;中間值等等&#xff0c;由於處理的對象是矩陣資料&#xff0c;故其基本統計之技巧已經廣為應用&#xff0c;其觀念也會在正常之運作中出現。統計學中比較特殊應用者為機率、亂數、常態…

yii2通过url访问类中的方法_每日学点---nginx变量使用方法详解(3)

也有一些内建变量是支持改写的&#xff0c;其中一个例子是 $args. 这个变量在读取时返回当前请求的 URL 参数串(即请求 URL 中问号后面的部分&#xff0c;如果有的话 )&#xff0c;而在赋值时可以直接修改参数串。我们来看一个例子&#xff1a;location /test { set $orig_args…

python语言format用法_详解Python中的format格式化函数的使用方法

format函数实现字符串格式化的功能 基本语法为&#xff1a; 通过 : 和 {} 来控制字符串的操作 一、对字符串进行操作 1. 不设置指定位置&#xff0c;按默认顺序插入 ①当参数个数等于{}个数的时候 str_1 "小明{}小美,可是小美{}小明".format("喜欢", &quo…

ps安装了可以打开但开始里面找不到_PS2018打开了钢笔压力但却没有压感的解决方法...

1.首先应确定是否安装数位板的驱动&#xff0c;如果驱动出现问题也可以试着重装一下。2.&#xff08;这里以Photoshop CC 2018为例&#xff09;接下来检查这个“始终对‘大小’使用‘压力’”按钮是否打开&#xff0c;如果是关闭的&#xff0c;试着打开。3.随后F5进入“画笔”选…

t检验的p值对照表_论文数据分析实战 | 如何对汇总数据进行t检验

在SPSS统计分析交流群中有学员在阅读论文的过程中看到下面的这张表格&#xff1a;这张表中记录了第16届世界男子篮球锦标赛中国队与前8名球队进攻指标比较的结果&#xff0c;其中这份表格并没有给出详细的P值&#xff0c;而只是告诉我们P值小于多少。在这种只有汇总数据&#x…