org.openpnp.vision.pipeline.stages.MatchTemplate
文章目录org.openpnp.vision.pipeline.stages.MatchTemplate功能参数例子test1生成测试图片cv-pipeline config错误效果org.openpnp.vision.pipeline.stages.MatchTemplate对纯色模板支持错误生成测试图片cv-pipeline config效果备注ENDorg.openpnp.vision.pipeline.stages.MatchTemplate功能在输入图像中检测与给定模板图像相似的区域。它基于 OpenCV 的归一化互相关模板匹配方法TM_CCOEFF_NORMED并集成了局部极大值检测和距离过滤返回所有匹配位置按得分降序排列。该阶段常用于零件定位、模式识别等场景。参数参数名类型默认值描述templateStageNameString无必需提供模板图像的前一阶段名称。该阶段必须输出包含图像Result.image的结果。thresholddouble0.7绝对匹配得分阈值归一化相关系数。匹配得分低于此值的区域将被忽略。取值范围 0~1。corrdouble0.85相对于全局最大匹配得分的比例阈值。实际动态阈值为max(threshold, corr * maxVal)。例如若最大得分为 0.9corr0.85则动态下限为 0.765。normalizebooleantrue是否将每个匹配得分除以全局最大匹配得分。若为true最高得分归一化为 1其余为相对值若为false输出原始相关系数。maxDistanceint10000匹配矩形中心与预设中心默认为图像中心之间的最大允许欧氏距离像素。超过此距离的匹配将被丢弃。propertyNameString用于运行时动态覆盖参数的属性名前缀。若设置可通过pipeline.setProperty(propertyName .maxDistance, value)或pipeline.setProperty(propertyName .center, value)在运行时调整maxDistance和center。例子MatchTemplate 不支持旋转MatchTemplate 要求输入图像和模板必须是 8位单通道灰度且类型一致test1不对的版本生成测试图片importcv2importnumpy as np def generate_all_images():# 1. 模板图像正面红色矩形宽200高100templatenp.zeros((100,200,3),dtypenp.uint8)cv2.rectangle(template,(0,0),(200,100),(0,0,255),-1)cv2.imwrite(template_rect.png,template)print(生成模板:template_rect.png)#2.测试图像蓝色背景640x480 imgnp.full((480,640,3),(255,0,0),dtypenp.uint8)# 红色矩形1中心(150,150)尺寸200x100角度0° rect1((150,150),(200,100),0)box1cv2.boxPoints(rect1)box1np.int32(box1)cv2.fillPoly(img,[box1],(0,0,255))# 红色矩形2中心 (480, 280)尺寸 200x100角度 0°rect2((480,280),(200,100),0)box2cv2.boxPoints(rect2)box2np.int32(box2)cv2.fillPoly(img,[box2],(0,0,255))# 绿色三角形干扰物ptsnp.array([[580,430],[620,460],[560,460]], np.int32)cv2.fillPoly(img,[pts],(0,255,0))cv2.imwrite(test_multi_parts.png, img)print(生成测试图像: test_multi_parts.png (两个200x100无旋转红色矩形 一个绿色三角形))if__name____main__:generate_all_images()cv-pipeline configcv-pipelinestagescv-stageclassorg.openpnp.vision.pipeline.stages.ImageReadnamereadTemplateColorenabledtruefileD:\3rd\openpnp_prj\openpnp-official\openpnp-test-images\my_test\template_rect.pngcolor-spaceBgrhandle-as-capturedfalse/cv-stageclassorg.openpnp.vision.pipeline.stages.ConvertColornametemplateGrayenabledtrueconversionBgr2Gray/cv-stageclassorg.openpnp.vision.pipeline.stages.ImageReadnamereadTestColorenabledtruefileD:\3rd\openpnp_prj\openpnp-official\openpnp-test-images\my_test\test_multi_parts.pngcolor-spaceBgrhandle-as-capturedfalse/cv-stageclassorg.openpnp.vision.pipeline.stages.ConvertColornametestGrayenabledtrueconversionBgr2Gray/cv-stageclassorg.openpnp.vision.pipeline.stages.MatchTemplatenamematchenabledtruetemplate-stage-nametemplateGraythreshold0.7corr0.85normalizetruemax-distance10000property-name/cv-stageclassorg.openpnp.vision.pipeline.stages.ImageRecallnamerecallOriginalenabledtrueimage-stage-namereadTestColor/cv-stageclassorg.openpnp.vision.pipeline.stages.DrawTemplateMatchesnamedrawMatchesenabledtruetemplate-matches-stage-namematchcolorr0g255b0a255//cv-stagecv-stageclassorg.openpnp.vision.pipeline.stages.ImageWritenamesaveenabledtruefileoutput_match_template.png//stages/cv-pipeline错误效果以上图片和cv-pipeline脚本检测出的匹配区域为右上角的矩形但是那里并没有什么前景图片。org.openpnp.vision.pipeline.stages.MatchTemplate对纯色模板支持错误看cv-pipeline配置写法没有发现错误但是就是识别错误。后来修改了模板不为纯色图形(实际的模板也不会是纯色图形, e.g. 单个电阻)然后就可以了。生成测试图片importcv2importnumpy as np def generate_all_images():# 模板图像红色矩形 内部黑色小矩形templatenp.zeros((100,200,3),dtypenp.uint8)cv2.rectangle(template,(0,0),(200,100),(0,0,255),-1)# 添加内部特征中心画一个20x20 的黑色方块 cv2.rectangle(template,(90,40),(110,60),(0,0,0),-1)cv2.imwrite(template_rect.png,template)#1.模板图像正面红色矩形宽200高100 # templatenp.zeros((100,200,3),dtypenp.uint8)# cv2.rectangle(template,(0,0),(200,100),(0,0,255),-1)# cv2.imwrite(template_rect.png,template)# print(生成模板:template_rect.png)#2.测试图像蓝色背景640x480 imgnp.full((480,640,3),(255,0,0),dtypenp.uint8)# 红色矩形1中心(150,150)尺寸200x100 rect1((150,150),(200,100),0)box1cv2.boxPoints(rect1)box1np.int32(box1)cv2.fillPoly(img,[box1],(0,0,255))# 添加黑色小方块中心在矩形中心cv2.rectangle(img,(140,140),(160,160),(0,0,0), -1)# 红色矩形2中心 (480, 280)尺寸 200x100rect2((480,280),(200,100),0)box2cv2.boxPoints(rect2)box2np.int32(box2)cv2.fillPoly(img,[box2],(0,0,255))# 添加黑色小方块cv2.rectangle(img,(470,270),(490,290),(0,0,0), -1)# 绿色三角形干扰物ptsnp.array([[580,430],[620,460],[560,460]], np.int32)cv2.fillPoly(img,[pts],(0,255,0))cv2.imwrite(test_multi_parts.png, img)print(生成测试图像: test_multi_parts.png (两个200x100无旋转红色矩形 一个绿色三角形))if__name____main__:generate_all_images()cv-pipeline configcv-pipelinestagescv-stageclassorg.openpnp.vision.pipeline.stages.ImageReadnamereadTemplateColorenabledtruefileD:\3rd\openpnp_prj\openpnp-official\openpnp-test-images\my_test\template_rect.pngcolor-spaceBgrhandle-as-capturedfalse/cv-stageclassorg.openpnp.vision.pipeline.stages.ConvertColornametemplateGrayenabledtrueconversionBgr2Gray/cv-stageclassorg.openpnp.vision.pipeline.stages.ImageReadnamereadTestColorenabledtruefileD:\3rd\openpnp_prj\openpnp-official\openpnp-test-images\my_test\test_multi_parts.pngcolor-spaceBgrhandle-as-capturedfalse/cv-stageclassorg.openpnp.vision.pipeline.stages.ConvertColornametestGrayenabledtrueconversionBgr2Gray/cv-stageclassorg.openpnp.vision.pipeline.stages.MatchTemplatenamematchenabledtruetemplate-stage-nametemplateGraythreshold0.7corr0.8normalizetruemax-distance10000property-name/cv-stageclassorg.openpnp.vision.pipeline.stages.ImageWritenamesaveTestGrayenabledtruefileD:\3rd\openpnp_prj\openpnp-official\openpnp-test-images\my_test\testGray_debug.png/cv-stageclassorg.openpnp.vision.pipeline.stages.ImageRecallnamerecallOriginalenabledtrueimage-stage-namereadTestColor/cv-stageclassorg.openpnp.vision.pipeline.stages.DrawTemplateMatchesnamedrawMatchesenabledtruetemplate-matches-stage-namematchcolorr0g255b0a255//cv-stagecv-stageclassorg.openpnp.vision.pipeline.stages.ImageWritenamesaveenabledtruefileoutput_match_template.png//stages/cv-pipeline效果match阶段参数corr 0.8备注stages.MatchTemplate对纯色模板支持不好的问题在实际应用中不是致命问题。因为实际视觉识别时作为模板的图像(e.g. 单个电阻)都不可能是纯色的。如果感兴趣可以将MatchTemplate拷贝一份实现自己的myMatchTemplate. 然后试一下对纯色模板的匹配效果。在同一个包 org.openpnp.vision.pipeline.stages 下复制 MatchTemplate.java重命名为 MyMatchTemplate.java。 将 public class MatchTemplate extends CvStage 改为 public class MyMatchTemplate extends CvStage。 在 process 方法修改匹配方法: Imgproc.matchTemplate(mat, template, result, Imgproc.TM_SQDIFF_NORMED);增加MyMatchTemplate在openpnp中的注册 // CvPipelineEditor.java SuppressWarnings(serial)public class CvPipelineEditor extends JPanel{static{stageClassesnew HashSet();// Parameter stages. registerStageClass(ParameterNumeric.class);registerStageClass(ParameterBool.class);// Vision stages. //... registerStageClass(MatchTemplate.class);END