如何在模板匹配中找到 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 内对象的旋转?的主要内容,如果未能解决你的问题,请参考以下文章