前言
最近看了Halcon上一个问题,说是检测胶圈是否闭合的问题,感觉挺有意思,看了Halcon的解决方案,确实挺完美,这里就想着用C++ OpenCV实现一下。
Halcon问题链接:https://www.51halcon.com/forum.php?mod=viewthread&tid=1262&extra=page%3D2
1. 检测步骤
主要步骤如下:
- 转换灰度图像;
- 高斯模糊去除可能存在的噪声
- 二值化获取图像中环;
- 形态学开操作去除非环区域;
- 查找轮廓;
- 填充环上空洞区域;
- 形态学闭操作弥补环的缝隙;(如果有其它更好的方法,欢迎留言告知)
- 步骤7图像减去步骤6图像,就得到缝隙的大致区域(填充的环不完美,有凹陷)
- 将缝隙区域绘制到原图上显示检测结果。
2. C++OpenCV实现
#include <iostream>
#include <opencv2\imgcodecs.hpp>
#include <opencv2\core.hpp>
#include <opencv2\imgproc.hpp>
#include <opencv2\highgui.hpp>
#include <vector>
int main()
{
using namespace cv;
std::string strImgFile = "C:\\Temp\\common\\Workspace\\Opencv\\images\\ring.png";
Mat mSrc = imread(strImgFile);
CV_Assert(!mSrc.empty());
Mat mGrey;
cvtColor(mSrc, mGrey, COLOR_BGR2GRAY);
CV_Assert(