# opencv学习笔记 (一)## 识别颜色块并且标定轮廓和中心

放肆的年华 提交于 2020-01-18 00:08:17

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

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

Alt

思路如下:

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] = Point2d(mu[i].m10 / mu[i].m00, mu[i].m01 / mu[i].m00); 
 }

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

//画轮廓及其质心并显示  
 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);      //画中心圆
 }

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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!