C++ OpenCV实践:复杂背景下划痕检测

您所在的位置:网站首页 划痕简单处理方法图片 C++ OpenCV实践:复杂背景下划痕检测

C++ OpenCV实践:复杂背景下划痕检测

2024-04-08 08:26| 来源: 网络整理| 查看: 265

文章目录 前言1. 检测步骤2. C++ OpenCV实现3. 结果展示总结

前言

今天在51Halcon网站答疑区看到划痕检测的求助,觉得挺有意思,就用OpenCV实现了下,这里分享给大家。

问题链接:https://www.51halcon.com/thread-941-1-1.html

1. 检测步骤

先上原图: 请添加图片描述 这个问题就是检测上图环上右上角大约45度的一个划痕或者缝隙。

本人实现检测主要步骤:

图片缩小1倍(图片太大了,OpenCV显示窗口显示不全)图像灰度化;高斯模糊去除噪声影响;对图像做均值化处理,将划痕覆盖;均值前后图像差值处理,得到包含划痕的灰度图;二值化处理提取前景轮廓,分析划痕几何特性,筛选划痕轮廓;绘制满足条件的划痕轮廓。 2. C++ OpenCV实现 #include #include #include #include #include using namespace cv; int main() { std::string strImgFile = "C:\\Temp\\common\\Workspace\\Opencv\\images\\crack_with_complex_bg.bmp"; Mat mSrc = imread(strImgFile); CV_Assert(!mSrc.empty()); resize(mSrc, mSrc, Size(mSrc.cols/2, mSrc.rows/2)); Mat mGray; cvtColor(mSrc, mGray, COLOR_BGR2GRAY); CV_Assert(!mGray.empty()); GaussianBlur(mGray, mGray, Size(5, 5), -1); Mat mMean; blur(mGray, mMean, Size(15, 15)); CV_Assert(!mMean.empty()); Mat mDiff; absdiff(mMean, mGray, mDiff); CV_Assert(!mDiff.empty()); imshow("diff", mDiff); Mat mThresh; threshold(mDiff, mThresh, 5, 255, THRESH_BINARY); CV_Assert(!mThresh.empty()); imshow("thres", mThresh); std::vector contours; findContours(mThresh, contours, RETR_TREE, CHAIN_APPROX_NONE); RNG rng; Mat mSrcCopy = mSrc.clone(); for (int i = 0; i /*int b = rng.uniform(0, 256); int g = rng.uniform(0, 256); int r = rng.uniform(0, 256); drawContours(mSrcCopy, contours, i, Scalar(b, g, r));*/ drawContours(mSrcCopy, contours, i, Scalar(0, 0, 255)); } } imshow("contours", mSrcCopy); waitKey(0); destroyAllWindows(); return 0; } 3. 结果展示

在这里插入图片描述

总结

在轮廓筛选时设置的筛选规则仅适用于原始图缩小1倍大小,换一张图或者使用原始图大小就要更新筛选规则了,通用性方面可能不太好。个人觉得可以对原图做一个Mask图像,仅对圆环区域进行轮廓提取与过滤,这样不论是速度方面还是通用性方面都会更好,本人这里就不实现了,感兴趣的读者可以试试,谢谢大家!



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3