某男子学院初学小白,刚开始学习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] = 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); //画中心圆
}
效果如下:(以黄色为例)
来源:CSDN
作者:Rosen.
链接:https://blog.csdn.net/Rosen_er/article/details/104021788