我正在使用图像处理,openCV,C ++来检查瓶子的畸形。我是openCV的新手。如果有人可以指导我如何实现这一目标,那将是一个很大的帮助。如何使用opencv和c ++检测瓶子形状的缺陷。我将瓶子图像作为系统的输入。当输入一个畸形的瓶子时,系统应检测到它。
瓶子图像不足:
好瓶图片:
答案 0 :(得分:1)
基本方法: 你可以提取边缘然后注册两个图像。在openCV中,您将获得几个过滤器。
完美方法: 你可以使用统计形状建模算法,我不确定它是否存在于OPenCV中。
答案 1 :(得分:0)
比较并不简单,因为您可能需要在两个轮廓的区域之间建立一些对应关系(可能您可以使用网格并使用其单元格作为ROI - 现在许多ROI用于单个图像 - 来解决对应的复杂性)
红色投资回报率:
基于网格的方法(多个ROI):
答案 2 :(得分:0)
您可以尝试使用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),最高值对应于最佳匹配。
在您的情况下,您可以使用与模板图像的偏差的公差值来阈值结果矩阵,如果阈值处理的结果是空的Mat,则可以将瓶子识别为有缺陷。您可能需要进行一些实验才能找到合适的阈值。如果想要精确匹配,则必须在结果矩阵中查找0/1(根据方法)。
您可以在与here匹配的opencv模板上找到更多信息。
希望这有帮助。