使用 OpenCV 进行零件识别/分类

Posted

技术标签:

【中文标题】使用 OpenCV 进行零件识别/分类【英文标题】:Parts Recognition / Classification with OpenCV 【发布时间】:2013-03-08 21:22:15 【问题描述】:

我刚刚开始探索 OpenCV 和 EmguCV .NET 包装器,需要了解其功能大图的人们的一些总体指导,也许还有那些已经解决了与我需要完成的任务类似的任务的人。

我将有一系列静态照片,并且在每张图像中都会出现一个物体或什么都没有。这些物体是金属硬件(螺栓),它们将侧放,长度平行于图像的顶部/底部(即,图片是从上方拍摄的)。如果有一个对象,它将是大约 100 种不同类型的螺栓中的一种,其中一些具有非常相似但不相同的特征和尺寸。例如,它们的轮廓大部分都是矩形,但长度和宽度(直径)会有所不同,并且头部可以是六边形或圆形(在轮廓中分别被视为矩形或圆形的小段) ) 或将有用于埋头孔应用的锥形头。我正在谈论的零件类型的插图(这只是为了显示零件的类型-我的图像是单个零件的照片):

(来源:donsnotes.com)

我需要对它们进行分类,以便区分所有尺寸和类型。 1-3/8" 螺栓应归类为与 1-1/2" 螺栓不同,即使它们具有相同的直径和相同的头部类型。尺寸之间的最小长度差为 1/8 英寸,而不是标准的 1/16 英寸。

如果重要的话,我可以很好地控制以下内容:

照明(但背光不实用) 背景的外观(可能对背景减法有用?) 相机到物体的距离(相同的物体会 图像中的尺寸总是相同的) 通常,螺栓的位置 - 它将水平放置在 它的侧面,与图像的顶部/底部边缘平行 框架。我无法控制它的头是向左还是向右 图片。

不幸的是,我找不到任何直接解决我需要做的事情的在线论文或文章 - 但有很多可以说明更简单的任务,例如寻找彩色球或寻找矩形。我找不到任何关于识别和分类大量不同但相似的形状的东西。我确实有两本推荐的 OpenCV 书籍,虽然它们很棒,但它们似乎并没有解决这个问题。

我在示例图像上发现了相当干净的 Canny 边缘,但由于照明,部件内部存在大量噪点。这使得寻找干净的霍夫线段有点参差不齐。

我不确定是否应该尝试使用通过测量 Canny 边缘计算的绝对尺寸来减少可能匹配的列表 - 然后使用更强大的东西,如级联分类器......?或者什么。

我真的只是在寻找某人对总体战略或正确方向的看法......

谁能给我一些东西让我开始尝试?我真的很茫然。

谢谢!

【问题讨论】:

哼,如果纯粹用相机完成的话,这听起来像是一个噩梦般的 3 个人/月(或更多)软件开发项目。你不能得到额外的信号吗?如今,带有数字读数的秤很便宜,而且它可能会大大减少搜索空间。你知道,计算机视觉第二定律:“计算机视觉没有一个问题是无法通过足够数量的硬件来解决的”;-) 考虑添加除图像功能之外的其他功能,以“清除”实例可能/可能不是实例。我想到的东西是重量。但是就像其他人所说的那样,您是该领域的专家,因此您需要成为提出高级特征的人。不幸的是,除非您可以消除大部分上述图像噪声(例如照明),否则纯图像分类将非常困难。 谢谢你们的cmets。我希望我能称重它们,但它们在[快速]运动中。获得正确的照明和快门速度就足够了。停止称重是不切实际的,我有理由确定我买不起任何能可靠地称重的东西! 【参考方案1】:

根据我的经验,我建议您以下内容。你比我们大多数人都知道如何手动分类,对吧?所以想一想当你分类时你的大脑会发生什么。假设,您从顶视图看到一个圆形,那么现在您的问题变成了如何识别该形状?在这里发布这样的问题,对其他人来说会容易得多。特征提取只不过是当你看到那个物体时大脑的想法。

对于这个问题,我建议您首先保持深色背景,以便有必要对该图像进行二值化。然后,如果它是顶视图,您可以看到圆形、六边形等。然后只得到边缘。然后得到一个最小边界圆并得到它的直径。找到最小边界圆的算法和代码可以得到here。

就形状而言,我建议您对该二值图像进行渐变,然后仅在边缘点(您在顶视图中获得)计算该渐变的角度。该梯度的直方图将是您的特征向量。查看不同形状的条形图。如果你的大脑可以区分,那么你可以考虑使用哪个分类器。我现在不想对此发表评论,因为它取决于很多事情,例如特征的分布、它们的可分离性以及最重要的速度要求。但现在不用担心分类器。

现在,让我们尝试解决高度问题。我假设您可以获得前视图,然后只需计算边界框(您可以从 MATLAB 中的regionprops 函数中获得)。

请注意,我只是在想象和谈论所有这些事情。您必须先按照我在第一段中所说的去做,然后看看答案的其他部分是否对您有意义。我假设您具有一定的数学背景来理解此答案中的某些术语。如果没有,请不要犹豫,问。

附: +1 提出一个好问题。

【讨论】:

非常感谢您的回复。我将首先处理一个最小边界矩形。希望由此我可以可靠地确定零件长度。如果我然后在该矩形的中间裁剪图像,我应该只处理螺栓柄的一部分并且可以确定它的宽度。到那时,我已经到了一半——将研究更复杂的问题,即最后对头部形状进行分类。希望在第一部分中获得足够的经验,这样我在研究头部时会遇到更少的问题。再次感谢! 上面提到的形状描述符也有开源代码。【参考方案2】:

您的问题是典型的模式识别任务。 在您的场景中,我将使用形状描述符,然后将其用于识别。论文"Shape Matching and Object Recognition using Shape contexts". 中描述了一种有趣的方法

作者之一 Jitendra Malik 是我几个月前参加的一门有趣的 coursera 计算机视觉课程的老师。

【讨论】:

感谢您的支持 - 它看起来很有帮助,但也让我大开眼界。我认为它将适用于我正在做的螺栓头分类部分。非常感谢您的回复!

以上是关于使用 OpenCV 进行零件识别/分类的主要内容,如果未能解决你的问题,请参考以下文章

opencv SVM多分类 人脸识别

opencv-python下简单KNN分类识别

opencv实时识别指定物体

OpenCV 人脸识别

如何利用opencv进行样本训练

opencv加载人脸分类器出错