当前位置: 首页 > news >正文

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
      • 效果
    • 备注
    • END

org.openpnp.vision.pipeline.stages.MatchTemplate

功能

在输入图像中检测与给定模板图像相似的区域。它基于 OpenCV 的归一化互相关模板匹配方法(TM_CCOEFF_NORMED),并集成了局部极大值检测和距离过滤,返回所有匹配位置(按得分降序排列)。该阶段常用于零件定位、模式识别等场景。

参数

参数名类型默认值描述
templateStageNameString无(必需)提供模板图像的前一阶段名称。该阶段必须输出包含图像(Result.image)的结果。
thresholddouble0.7绝对匹配得分阈值(归一化相关系数)。匹配得分低于此值的区域将被忽略。取值范围 0~1。
corrdouble0.85相对于全局最大匹配得分的比例阈值。实际动态阈值为max(threshold, corr * maxVal)。例如,若最大得分为 0.9,corr=0.85,则动态下限为 0.765。
normalizebooleantrue是否将每个匹配得分除以全局最大匹配得分。若为true,最高得分归一化为 1,其余为相对值;若为false,输出原始相关系数。
maxDistanceint10000匹配矩形中心与预设中心(默认为图像中心)之间的最大允许欧氏距离(像素)。超过此距离的匹配将被丢弃。
propertyNameString""用于运行时动态覆盖参数的属性名前缀。若设置,可通过pipeline.setProperty(propertyName + ".maxDistance", value)pipeline.setProperty(propertyName + ".center", value)在运行时调整maxDistancecenter

例子

MatchTemplate 不支持旋转
MatchTemplate 要求输入图像和模板必须是 8位单通道(灰度)且类型一致

test1

不对的版本

生成测试图片

importcv2importnumpy as np def generate_all_images():# 1. 模板图像(正面红色矩形,宽200高100)template=np.zeros((100,200,3),dtype=np.uint8)cv2.rectangle(template,(0,0),(200,100),(0,0,255),-1)cv2.imwrite("template_rect.png",template)print("生成模板:template_rect.png")#2.测试图像(蓝色背景640x480) img=np.full((480,640,3),(255,0,0),dtype=np.uint8)# 红色矩形1:中心(150,150),尺寸200x100,角度0° rect1=((150,150),(200,100),0)box1=cv2.boxPoints(rect1)box1=np.int32(box1)cv2.fillPoly(img,[box1],(0,0,255))# 红色矩形2:中心 (480, 280),尺寸 200x100,角度 0°rect2=((480,280),(200,100),0)box2=cv2.boxPoints(rect2)box2=np.int32(box2)cv2.fillPoly(img,[box2],(0,0,255))# 绿色三角形(干扰物)pts=np.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 config

<cv-pipeline><stages><cv-stageclass="org.openpnp.vision.pipeline.stages.ImageRead"name="readTemplateColor"enabled="true"file="D:\3rd\openpnp_prj\openpnp-official\openpnp-test-images\my_test\template_rect.png"color-space="Bgr"handle-as-captured="false"/><cv-stageclass="org.openpnp.vision.pipeline.stages.ConvertColor"name="templateGray"enabled="true"conversion="Bgr2Gray"/><cv-stageclass="org.openpnp.vision.pipeline.stages.ImageRead"name="readTestColor"enabled="true"file="D:\3rd\openpnp_prj\openpnp-official\openpnp-test-images\my_test\test_multi_parts.png"color-space="Bgr"handle-as-captured="false"/><cv-stageclass="org.openpnp.vision.pipeline.stages.ConvertColor"name="testGray"enabled="true"conversion="Bgr2Gray"/><cv-stageclass="org.openpnp.vision.pipeline.stages.MatchTemplate"name="match"enabled="true"template-stage-name="templateGray"threshold="0.7"corr="0.85"normalize="true"max-distance="10000"property-name=""/><cv-stageclass="org.openpnp.vision.pipeline.stages.ImageRecall"name="recallOriginal"enabled="true"image-stage-name="readTestColor"/><cv-stageclass="org.openpnp.vision.pipeline.stages.DrawTemplateMatches"name="drawMatches"enabled="true"template-matches-stage-name="match"><colorr="0"g="255"b="0"a="255"/></cv-stage><cv-stageclass="org.openpnp.vision.pipeline.stages.ImageWrite"name="save"enabled="true"file="output_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():# 模板图像(红色矩形 + 内部黑色小矩形)template=np.zeros((100,200,3),dtype=np.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.模板图像(正面红色矩形,宽200100) # template=np.zeros((100,200,3),dtype=np.uint8)# cv2.rectangle(template,(0,0),(200,100),(0,0,255),-1)# cv2.imwrite("template_rect.png",template)# print("生成模板:template_rect.png")#2.测试图像(蓝色背景640x480) img=np.full((480,640,3),(255,0,0),dtype=np.uint8)# 红色矩形1:中心(150,150),尺寸200x100 rect1=((150,150),(200,100),0)box1=cv2.boxPoints(rect1)box1=np.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)box2=cv2.boxPoints(rect2)box2=np.int32(box2)cv2.fillPoly(img,[box2],(0,0,255))# 添加黑色小方块cv2.rectangle(img,(470,270),(490,290),(0,0,0), -1)# 绿色三角形(干扰物)pts=np.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 config

<cv-pipeline><stages><cv-stageclass="org.openpnp.vision.pipeline.stages.ImageRead"name="readTemplateColor"enabled="true"file="D:\3rd\openpnp_prj\openpnp-official\openpnp-test-images\my_test\template_rect.png"color-space="Bgr"handle-as-captured="false"/><cv-stageclass="org.openpnp.vision.pipeline.stages.ConvertColor"name="templateGray"enabled="true"conversion="Bgr2Gray"/><cv-stageclass="org.openpnp.vision.pipeline.stages.ImageRead"name="readTestColor"enabled="true"file="D:\3rd\openpnp_prj\openpnp-official\openpnp-test-images\my_test\test_multi_parts.png"color-space="Bgr"handle-as-captured="false"/><cv-stageclass="org.openpnp.vision.pipeline.stages.ConvertColor"name="testGray"enabled="true"conversion="Bgr2Gray"/><cv-stageclass="org.openpnp.vision.pipeline.stages.MatchTemplate"name="match"enabled="true"template-stage-name="templateGray"threshold="0.7"corr="0.8"normalize="true"max-distance="10000"property-name=""/><cv-stageclass="org.openpnp.vision.pipeline.stages.ImageWrite"name="saveTestGray"enabled="true"file="D:\3rd\openpnp_prj\openpnp-official\openpnp-test-images\my_test\testGray_debug.png"/><cv-stageclass="org.openpnp.vision.pipeline.stages.ImageRecall"name="recallOriginal"enabled="true"image-stage-name="readTestColor"/><cv-stageclass="org.openpnp.vision.pipeline.stages.DrawTemplateMatches"name="drawMatches"enabled="true"template-matches-stage-name="match"><colorr="0"g="255"b="0"a="255"/></cv-stage><cv-stageclass="org.openpnp.vision.pipeline.stages.ImageWrite"name="save"enabled="true"file="output_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{stageClasses=new HashSet<>();// Parameter stages. registerStageClass(ParameterNumeric.class);registerStageClass(ParameterBool.class);// Vision stages. //... registerStageClass(MatchTemplate.class);

END

http://www.jsqmd.com/news/654786/

相关文章:

  • 别再只把电压跟随器当‘缓冲’用了!聊聊它在阻抗匹配和电路保护里的那些‘隐藏技能’
  • BlenderCompat:Windows 7用户的终极Blender兼容方案
  • 番茄小说下载器:Rust驱动的跨平台数字内容管理解决方案
  • 2026年有实力的新风系统推荐机构分析,哪家口碑好怎么选 - mypinpai
  • 从零到精通:Retrieval-based-Voice-Conversion-WebUI完整指南
  • 如何在Windows电脑上使用任天堂Switch Joy-Con手柄:完整JoyCon-Driver指南
  • Squeel最佳实践:避免常见陷阱的10个实用技巧
  • EvilOSX与Empire对比:哪个才是macOS渗透测试的王者
  • 2026年靠谱的新年台历制造商推荐,源头工厂质量优价格美 - 工业设备
  • 德国工业4.0已经从概念走向实践
  • org.openpnp.vision.pipeline.stages.MatchPartTemplate
  • 【蓝牙开发指南】解决Keil5+nRF52832安装Pack时的常见错误及避坑技巧
  • 手把手教你学Simulink——基于Simulink的CLLC谐振变换器双向对称控制
  • 天猫超市购物卡快速回收,操作简单全程透明 - 团团收购物卡回收
  • 倒计时98天!2026奇点大会AI配音应用准入清单已启动内测——仅开放37家生态伙伴申请
  • Mac窗口置顶神器Topit:智能窗口管理,工作效率飙升200%
  • 旋片真空泵厂家/真空系统厂家/高真空机组厂家有哪些?水环真空泵/真空脱泡机哪家好?2026年品牌前七强权威推荐:盛飞领衔 - 栗子测评
  • 别再让网卡拖后腿!手把手教你调优工业相机网卡,解决丢帧、卡顿问题(附巨帧/缓冲区设置避坑指南)
  • C++的std--ranges管道优化
  • gInk热键配置终极指南:自定义快捷键提升工作效率
  • Panel版本升级终极指南:从旧版本平滑迁移到最新版的完整教程
  • 2026年源头智造精准赋能——苏州煜景衡(动态检重秤源头工厂+不锈钢滚筒秤知名厂家)品质技术解析 - 品牌推荐大师1
  • 终极Sunshine游戏串流指南:5分钟搭建你的跨设备游戏共享平台
  • 终极KMS激活解决方案:KMS_VL_ALL_AIO高效激活工具深度解析
  • ESP WiFi中继器终极访问控制指南:基于MAC地址的安全管理
  • 2946基于52单片机的16层电梯控制系统设计
  • 微信社交圈大扫除:如何一键发现那些悄悄离开的朋友?
  • Nintendo Switch游戏文件管理终极指南:NSC_BUILDER实战应用全解析
  • 从BetterSegmentedControl学习iOS控件开发的最佳实践
  • Claude Skill 编写入门:让 AI 拥有专属技能