博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
opencv轮廓及轮廓中心提取
阅读量:3962 次
发布时间:2019-05-24

本文共 1831 字,大约阅读时间需要 6 分钟。

1.打开图片

IplImage *src = cvLoadImage(图片路径,0);//opencv读取灰度图

2.创建一个新的图片容器用于存取转换后的图片,大小CvSize,深度depth,色彩nChannels需要与原图片一致

IplImage *desc;CvSize sz;//图像大小if(src){    sz.width = src->width*1;    sz.height = src->height*1;    desc = cvCreateImage(sz,src->depth,src->nChannels);    //cvResize(src,desc,CV_INTER_CUBIC);//图像大小变换,用于将src图片缩小,我就不做缩小了}

3.图像黑白二值化,用于筛选一定颜色深度的部分

第一个参数是输入图像,第二个是输出图像,第三个是方式。

cvThreshold( desc, dst_bw ,75, 255, CV_THRESH_BINARY ); //取阀值为50把图像转为二值图像

4.寻找轮廓

cvFindContours是寻找轮廓方法,将寻找的轮廓放入stor容器,cont是第一个轮廓的指针。后面的是序列头大小、提取模式、逼近方法、偏移量,照抄就可以了,出现问题了就阅读手册。

CvMemStorage *stor = cvCreateMemStorage(0);CvSeq *cont = cvCreateSeq(CV_SEQ_ELTYPE_POINT,sizeof(CvSeq),sizeof(CvPoint),stor);int Number_Object = cvFindContours(dst_bw,stor,&cont,sizeof(CvContour),CV_CHAIN_APPROX_NONE,                                   CV_CHAIN_APPROX_SIMPLE,cvPoint(0,0));

5.在画轮廓前先把像素变成白色的,这样我们看到的是一张画圈的白纸,轮廓显示得更直白

IplImage* dst_contours = cvCreateImage(sz,src->depth,src->nChannels);cvThreshold(dst_contours,dst_contours,0,255,CV_THRESH_BINARY);

6.描绘轮廓并且找中心点

这个中心点找的,我感觉并不是很好,从我的眼力观察来看。
点p为中心点,可以输出,点的像素坐标是正确的。

//描绘轮廓    for(;cont;cont = cont->h_next)    {        cvDrawContours(dst_contours,cont,CV_RGB(255,0,0),CV_RGB(255,0,0),0,1,8,cvPoint(0,0));        GetContourCenter(cont,p);        cvCircle(dst_contours,p, 2, cvScalar(0, 255, 0), 1, 8, 0);        cvDrawContours(dst_contours,cont, CV_RGB(255, 0, 0), CV_RGB(0, 0, 0), -1, 1);    }    //抓取轮廓中心void Widget::GetContourCenter(CvSeq *contour, CvPoint &p){	//重心法抓中心点	int contourlength = contour->total;	CvPoint *pt = 0;	double avg_px = 0, avg_py = 0;	for (int i = 0; i < contourlength; i++)	{		pt = CV_GET_SEQ_ELEM(CvPoint, contour, i);		avg_px += pt->x;		avg_py += pt->y;	}	p.x = avg_px / contourlength;	p.y = avg_py / contourlength;}

处理前

在这里插入图片描述
处理后
在这里插入图片描述
中心点像素坐标,左上角为(0,0),从图片左下角的点开始检测,从左到右,从下到上的顺序输出所有点的坐标。

转载地址:http://xeezi.baihongyu.com/

你可能感兴趣的文章
图像处理基本算法(汇总)以及实现
查看>>
C++编程获取本机网卡信息 本机IP 包括Windows和Linux
查看>>
C++连接CTP接口实现简单量化交易
查看>>
服务端使用c++实现websocket协议解析及通信
查看>>
C# string.Format使用说明
查看>>
Linux下安装Mysql数据库开发环境
查看>>
Linux用户及用户组添加和删除操作
查看>>
通用 Makefile 的编写方法以及多目录 makefile 写法
查看>>
C++的4种智能指针剖析使用
查看>>
RPC框架实现之容灾策略
查看>>
Docker私库
查看>>
hdu——1106排序(重定向)
查看>>
hdu——1556Color the ball(树状数组)
查看>>
hdu——1541Stars(树状数组)
查看>>
快速幂的精简代码
查看>>
求大数乘方的前n位数字(对数加快速幂)
查看>>
hdu——2602Bone Collector(第一类背包问题)
查看>>
hdu——1711Number Sequence(kmp专练)
查看>>
strstr函数和find函数的异同
查看>>
Java的反射
查看>>