如何在模板匹配中找到 ROI 内对象的旋转?

Posted

技术标签:

【中文标题】如何在模板匹配中找到 ROI 内对象的旋转?【英文标题】:How to find rotation of an object within an ROI in template matching? 【发布时间】:2021-10-11 06:38:25 【问题描述】:

我正在尝试检查充电器中的连接器引脚。工作是检查这些参数:

    两个引脚都存在 两者都有定义的高度 都是直的

我在 C# 和 EMGU 中使用模板匹配通过创建 roi 来提取模板,并在匹配后使用以下代码检查两个引脚是否存在:

 Image<Bgr, Byte> templateImage = pintofind;
      
  Image<Bgr, Byte> sourceImage = new Image<Bgr, Byte>(GrabImage.Bitmap);
       
        using (Image<Gray, float> imgMatch = sourceImage.MatchTemplate(templateImage, Emgu.CV.CvEnum.TM_TYPE.CV_TM_CCOEFF_NORMED))
                    

            Point[] MAX_Loc, Min_Loc;
            double[] min, max;
            imgMatch.MinMax(out min, out max, out Min_Loc, out MAX_Loc);

            using (Image<Gray, double> RG_Image = imgMatch.Convert<Gray, double>().Copy())
                                
                    if (max[0] > 0.75)
                
                    Rectangle match = new Rectangle(MAX_Loc[0], templateImage.Size);
                    sourceImage.Draw(match, new Bgr(Color.LimeGreen), 2);

                    lblresulttext.Text = "OK";
                    lbindgood.BackColor = Color.LimeGreen;
                
                else
                
                    Rectangle match = new Rectangle(MAX_Loc[0], templateImage.Size);
                    sourceImage.Draw(match, new Bgr(Color.Red), 2);
                    lblresulttext.Text = "NG";
                    lbindbad.BackColor = Color.Red;
                
            
            ibresult.Image = sourceImage;
        

这是我得到的结果:

检查针脚的存在效果很好,但现在我需要检查两者的高度是否相同,以及两者是否笔直,如下图所示:

请帮忙。

【问题讨论】:

【参考方案1】:

如果您想确定具体的故障,我不确定 MatchTemplate 是否是正确的方法。如果保证旋转一致,它可能是可用的,并且只需要检查实际图像是否与模板相同。但是,如果您需要测量长度或识别特定故障,您可能需要为每种故障创建一个模板,这可能不可行。

我会通过对图像进行阈值处理以将背景与前景分开来解决这个问题。大概您可以控制照明以使其变得相当简单。然后您应该能够使用contour features 找到充电器的位置和旋转。然后您应该能够将其与参考轮廓进行比较,请参阅MatchShapes。如果引脚是重要部分,您可能需要一些方法来隔离引脚,例如通过找到充电器的旋转边界框,并忽略除包含引脚的顶部之外的所有内容。

【讨论】:

【参考方案2】:

如果你能处理充电器的旋转,我认为使用2个模板比使用一个模板更好。 第一个模板可能是图钉的顶部,第二个模板可能是图钉的底部。检测出上下2对插脚后,即可测量插脚的高度和方向。

【讨论】:

以上是关于如何在模板匹配中找到 ROI 内对象的旋转?的主要内容,如果未能解决你的问题,请参考以下文章

2D图像处理:2D Shape_Base_Matching_缩放_旋转_ICP_显示ROI

旋转模板图像并执行模板匹配

模板匹配概述

实战基于OpenCV的水表字符识别(OCR)

javaopencv模板匹配多个

Opencv模板匹配