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

888 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

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

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

1651756604(2).jpg

思路如下:

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.绘制出轮廓和中心,我们可以使用到==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);      //画中心圆
 }

效果如下:(以黄色为例)

1651756533(2).jpg