这个问题是谁问个人我已经不记得了,刚开始的时候他发了这张图像给我,让我给他看一下,我当时告诉他转换一下色彩空间提取就好啦,后来我记得他在微信上有问了我一次,今天我整理文件看到这张图又想起了,感受他问了我好几回我都没回复挺不意思的,可是我实在不知道他是谁了,微信上消息太多,早已经把他淹没了,加之我记忆力退化严重,思来想去只好写篇文章告诉他,我回答了!若是看完感受对你也有用,点在看支持便可!html
先看看他发个人图像文件吧
在来讲说他的需求:
找到途中所有青色的区域,检测出来,绘制中心点!他用霍夫变换,结果直接翻车了,缘由其实我很理解,这个图有不少梯度干扰,噪声干扰,用了确定翻车!而后他就问我怎么办?ios
直接转换到HSV色彩空间,获得以下结果:微信
而后我选择5x5的开操做,完成以后获得ide
使用OpenCV轮廓发现,对轮廓拟合圆,求的圆心坐标获得输出结果以下:
怎么样,效果好吗?学习
上述步骤的代码演示,主要分为以下步骤
1.加载图像并转换到HSV色彩空间,获得mask
2.根据mask二值图像,进行形体学处理
3.使用轮廓发现,找到全部最外层轮廓
4.对轮廓进行圆拟合,获得圆心与半径,而后绘制
代码以下:spa
1#include <opencv2/opencv.hpp> 2#include <iostream> 3 4using namespace cv; 5using namespace std; 6 7int main(int argc, char** argv) { 8 Mat image = imread("D:/images/zsxq/zsxq_20.png"); 9 imshow("input", image); 10 11 // 色彩空间转换 12 Mat hsv, mask; 13 cvtColor(image, hsv, COLOR_BGR2HSV); 14 inRange(hsv, Scalar(40,43, 46), Scalar(50, 255, 255), mask); 15 imshow("mask", mask); 16 imwrite("D:/mask.png", mask); 17 18 // 形态学开操做 19 Mat se = getStructuringElement(MORPH_RECT, Size(5, 5), Point(-1, -1)); 20 morphologyEx(mask, mask, MORPH_OPEN, se); 21 imshow("binary", mask); 22 imwrite("D:/binary.png", mask); 23 24 // 轮廓发现 25 vector<vector<Point>> contours; 26 vector<Vec4i> hiearchy; 27 findContours(mask, contours, hiearchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE); 28 for (int i = 0; i < contours.size(); i++) { 29 // 圆拟合 30 RotatedRect rrt = fitEllipse(contours[i]); 31 Point ct = rrt.center; 32 int h = rrt.size.height; 33 int w = rrt.size.width; 34 printf("height : %d, width : %d \n", h, w); 35 circle(image, ct, 2, Scalar(0, 0, 255), 2, 8); 36 circle(image, ct, (h + w) / 4, Scalar(255, 0, 0), 2, 8, 0); 37 } 38 39 // 显示输出 40 imshow("result", image); 41 imwrite("D:/result.png", image); 42 waitKey(0); 43 return 0; 44}
但愿他会看到,若是看到给我留言知道一下!最后跟你们道歉一下,代码超过20行了@_@!!!!code
学习OpenCV4图像处理与二值分析教程,
你也能够跟我同样快速解决此类问题
OpenCV4 图像处理与视频分析实战教程视频