某男子学院初学小白,刚开始学习opencv一周,直接从做项目和参考代码开始

要做的就是识别这张图片中指定颜色的多边形并且标定轮廓和中心

在这里插入图片描述

思路如下:

1.提取颜色根据不同颜色所具有的不同的hsv范围。

2.将图片转化成hsv格式,通过hsv范围提取指定颜色图形转化成二值化图像

3.获得的二值化图像难免产生椒盐噪声,这时候我们可以运用循环中值滤波

形态学滤波去除核心函数morphologyEx

参考代码:

//针对二值化图像的处理降噪
 Mat kernel = getStructuringElement(MORPH_RECT, Size(8,8));   //创建结构元素大小为8*8
 medianBlur(pict2, pict2, 7);    //中值滤波 
 morphologyEx(pict2, pict2, MORPH_OPEN, kernel);  //开操作
 morphologyEx(pict2, pict2, MORPH_CLOSE, kernel);  //闭操作
 blur(pict2, pict2, Size(3, 3));            //均值滤波 

4.根据获得的二值化图像检测边缘(Canny函数),查找轮廓(findContours函数),然后可以根据公式计算轮廓矩和轮廓中心。

部分参考代码:

vector<Moments> mu(contours.size());    //计算轮廓矩  
 for (int i = 0; i < contours.size(); i++)
 {
  mu[i] = moments(contours[i], false);
 }
 vector<Point2f>  mc(contours.size());    //计算轮廓中心
 for (int i = 0; i < contours.size(); i++)
 {
  mc[i] = Point2f(mu[i].m10 / mu[i].m00, mu[i].m01 / mu[i].m00); 
 }

5.绘制出轮廓和中心,我们可以使用到drawContourscircle函数。
参考代码:

//画轮廓及其质心并显示  
 for (int i = 0; i < contours.size(); i++)
 {
  drawContours(pict1, contours, i, Scalar(0, 255, 0), 12, 8, hierarchy, 0, Point());      //绘制轮廓
  circle(pict1, mc[i],15, Scalar(255, 255, 255), -1, 6, 0);      //画中心圆
 }

效果如下:(以黄色为例)
在这里插入图片描述

希望对读者有所帮助,喜欢的话可以关注一下我的公众号,我会把学习笔记发在上面,大家可以一起共同学习!
Alt

Alt

GitHub 加速计划 / opencv31 / opencv
77.38 K
55.71 K
下载
OpenCV: 开源计算机视觉库
最近提交(Master分支:2 个月前 )
c3747a68 Added Universal Windows Package build to CI. 10 天前
9b635da5 - 10 天前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐