【发布时间】:2014-07-24 17:57:46
【问题描述】:
我正在使用图像处理、openCV、C++ 来检查瓶子的畸形。我对openCV很陌生。如果有人可以指导我正确的方向如何实现这一目标,那将是一个很大的帮助。如何使用opencv和c++检测瓶子形状的缺陷。我将瓶子图像作为系统的输入。当输入的瓶子形状不正确时,系统应该检测到它。
有缺陷的瓶子图片:
好瓶子图片:
【问题讨论】:
标签: image-processing
我正在使用图像处理、openCV、C++ 来检查瓶子的畸形。我对openCV很陌生。如果有人可以指导我正确的方向如何实现这一目标,那将是一个很大的帮助。如何使用opencv和c++检测瓶子形状的缺陷。我将瓶子图像作为系统的输入。当输入的瓶子形状不正确时,系统应该检测到它。
有缺陷的瓶子图片:
好瓶子图片:
【问题讨论】:
标签: image-processing
基本方法: 您可以提取边缘然后注册两个图像。在 openCV 中,您将获得几个过滤器。
完美的方法: 你可以使用统计形状建模算法,我不确定它是否在 OPenCV 中。
【讨论】:
比较并不简单,因为您可能必须在两个轮廓的区域之间建立一些对应关系(也许您可以使用网格并将其单元格用作 ROI - 现在单个图像的许多 ROI - 来解决通信复杂性)
红色的投资回报率:
基于网格的方法(多个 ROI):
【讨论】:
你可以试试opencv模板匹配功能。来自 opencv 文档:
模板匹配是一种查找图像中与模板图像(补丁)匹配(相似)的区域的技术。
它实现了滑动窗口方案,通过在源图像上滑动我们想要找到的模板图像并计算存储在结果矩阵中的相似性度量。
在结果矩阵中,最暗/最亮的位置表示最高匹配(根据所采用的模板匹配算法),这标志着模板最佳匹配的位置。可以使用结果矩阵上的 minMaxLoc 函数找到最亮的位置。
matchTemplate方法的签名如下:
matchTemplate( image, template, result, match_method ); //Matches the template
normalize( result, result, 0, 1, NORM_MINMAX, -1, Mat() ); //Normalizes the result
double minVal; double maxVal; Point minLoc; Point maxLoc; Point matchLoc;
minMaxLoc( result, &minVal, &maxVal, &minLoc, &maxLoc, Mat() ); //Finds the minimum and maximum values in the result
OpenCV 提供了几种不同的匹配算法,例如寻找强度的归一化平方差(CV_TM_SQDIFF_NORMED)。对于使用 CV_TM_SQDIFF_NORMED 获得的结果矩阵,最低值对应于最佳匹配。对于其他方法,例如归一化互相关 (CV_TM_CCORR_NORMED),最高 值对应于最佳匹配。
在您的情况下,您可以使用与模板图像偏差的容差值对结果矩阵进行阈值处理,如果阈值处理的结果是空垫,则可以确定瓶子有缺陷。您可能需要进行一些试验才能找到合适的阈值。如果您想要完全匹配,则必须在结果矩阵中查找 0/1(根据方法)。
你可以找到更多关于匹配here的opencv模板。
希望这会有所帮助。
【讨论】: