文章目录

  • 前言
  • 一、基于相关性的模板匹配
  • 二、基于相关性的模板匹配的代码实现
    • 1.Halcon中完成基于相关性的模板匹配
    • 2.MFC实现与Halcon混合编程
    • 3.实现效果

前言

正在学习Halcon的例程的基于相关性的模板匹配。花了点时间做了一个简单的demo。

首先简单记录一下什么是基于相关性的模板匹配:


一、基于相关性的模板匹配

归一化相关性.NCC,(normalization cross-correlation),顾名思义,就是用于归一化待匹配目标之间的相关程度,注意这里比较的是原始像素。通过在待匹配像素位置p(px,py)构建3*3邻域匹配窗口,与目标像素位置p’(px+d,py)同样构建邻域匹配窗口的方式建立目标函数来对匹配窗口进行度量相关性。它是基于图像灰度信息的匹配方法。

NCC的定义

在[-1,1]绝对尺度范围之间衡量两者的相似性。相关系数刻画了两者之间的近似程度的线性描述。一般说来,越接近于1,两者越近似的有线性关系。

二、基于相关性的模板匹配的代码实现

1.Halcon中完成基于相关性的模板匹配

在Halcon软件中,按住Ctrl+E的快捷键,打开Halcon中关于模板匹配的例程,如下图所示:

利用USB摄像头,任意选取一物体作为我的模板,参考Halcon例程实现代码如下:

* Image Acquisition 01: Code generated by Image Acquisition 01
open_framegrabber ('DirectShow', 1, 1, 0, 0, 0, 0, 'default', 8, 'gray', -1, 'false', 'default', '[0] ', 0, -1, AcqHandle)
grab_image_start (AcqHandle, -1)
grab_image_async (Image, AcqHandle, -1) /异步抓图gen_rectangle2 (ROI_0, 251.392, 498.324, rad(-95.6182), 128.183, 64.3729)*利用ROI选取模板area_center (ROI_0, Area, RowRef, ColumnRef)
reduce_domain (Image, ROI_0, ImageReduced)   dev_set_draw ('margin')
dev_display (Image)Rows := []
Cols := []create_ncc_model (ImageReduced, 'auto', -0.39, 0.79, 'auto', 'use_polarity', ModelID)
while (true)grab_image_async (Image, AcqHandle, -1)* Image Acquisition 01: Do somethingfind_ncc_model (Image, ModelID, 0, 360, 0.5, 1, 0.5, 'true', 0, Row, Column, Angle, Score)if(|Score| > 0)        *vector_angle_to_rigid (Row, Column, rad(49.8188), Row, Column, Angle, HomMat2D)*affine_trans_region (ROI_0, RegionAffineTrans, HomMat2D, 'nearest_neighbor')Rows := [Rows,Row]Cols := [Cols,Column]dev_display (Image)dev_display_ncc_matching_results (ModelID, 'green', Row, Column, Angle, 0)dev_display (Image)endif
endwhile
close_framegrabber (AcqHandle)

将以上Halcon代码导出为C++文件,部分代码如下:

using namespace HalconCpp;// Procedure declarations
// Chapter: Matching / Correlation-Based
// Short Description: Display the results of Correlation-Based Matching.
void dev_display_ncc_matching_results (HTuple hv_ModelID, HTuple hv_Color, HTuple hv_Row, HTuple hv_Column, HTuple hv_Angle, HTuple hv_Model);//函数声明// Procedures
// Chapter: Matching / Correlation-Based
// Short Description: Display the results of Correlation-Based Matching.
void dev_display_ncc_matching_results (HTuple hv_ModelID, HTuple hv_Color, HTuple hv_Row, HTuple hv_Column, HTuple hv_Angle, HTuple hv_Model)//函数定义
{// Local iconic variablesHObject  ho_ModelRegion, ho_ModelContours, ho_ContoursAffinTrans;HObject  ho_Cross;// Local control variablesHTuple  hv_NumMatches, hv_Index, hv_Match, hv_HomMat2DIdentity;HTuple  hv_HomMat2DRotate, hv_HomMat2DTranslate, hv_RowTrans;HTuple  hv_ColTrans;//This procedure displays the results of Correlation-Based Matching.//hv_NumMatches = hv_Row.TupleLength();if (0 != (hv_NumMatches>0)){if (0 != ((hv_Model.TupleLength())==0)){TupleGenConst(hv_NumMatches, 0, &hv_Model);}else if (0 != ((hv_Model.TupleLength())==1)){TupleGenConst(hv_NumMatches, hv_Model, &hv_Model);}{HTuple end_val9 = (hv_ModelID.TupleLength())-1;HTuple step_val9 = 1;for (hv_Index=0; hv_Index.Continue(end_val9, step_val9); hv_Index += step_val9){GetNccModelRegion(&ho_ModelRegion, HTuple(hv_ModelID[hv_Index]));GenContourRegionXld(ho_ModelRegion, &ho_ModelContours, "border_holes");if (HDevWindowStack::IsOpen())SetColor(HDevWindowStack::GetActive(),HTuple(hv_Color[hv_Index%(hv_Color.TupleLength())]));{HTuple end_val13 = hv_NumMatches-1;HTuple step_val13 = 1;for (hv_Match=0; hv_Match.Continue(end_val13, step_val13); hv_Match += step_val13){if (0 != (hv_Index==HTuple(hv_Model[hv_Match]))){HomMat2dIdentity(&hv_HomMat2DIdentity);HomMat2dRotate(hv_HomMat2DIdentity, HTuple(hv_Angle[hv_Match]), 0, 0, &hv_HomMat2DRotate);HomMat2dTranslate(hv_HomMat2DRotate, HTuple(hv_Row[hv_Match]), HTuple(hv_Column[hv_Match]), &hv_HomMat2DTranslate);AffineTransContourXld(ho_ModelContours, &ho_ContoursAffinTrans, hv_HomMat2DTranslate);if (HDevWindowStack::IsOpen())DispObj(ho_ContoursAffinTrans, HDevWindowStack::GetActive());AffineTransPixel(hv_HomMat2DTranslate, 0, 0, &hv_RowTrans, &hv_ColTrans);GenCrossContourXld(&ho_Cross, hv_RowTrans, hv_ColTrans, 6, HTuple(hv_Angle[hv_Match]));if (HDevWindowStack::IsOpen())DispObj(ho_Cross, HDevWindowStack::GetActive());}}}}}}return;
}void action()
{// Local iconic variablesHObject  ho_Image, ho_ROI_0, ho_ImageReduced;// Local control variablesHTuple  hv_AcqHandle, hv_Area, hv_RowRef, hv_ColumnRef;HTuple  hv_Rows, hv_Cols, hv_ModelID, hv_Row, hv_Column;HTuple  hv_Angle, hv_Score;//Image Acquisition 01: Code generated by Image Acquisition 01OpenFramegrabber("DirectShow", 1, 1, 0, 0, 0, 0, "default", 8, "gray", -1, "false", "default", "[0] ", 0, -1, &hv_AcqHandle);GrabImageStart(hv_AcqHandle, -1);GrabImageAsync(&ho_Image, hv_AcqHandle, -1);GenRectangle2(&ho_ROI_0, 378.959, 523.422, HTuple(86.7433).TupleRad(), 147.265, 69.2766);//此处对应的选取即为Halcon中选取的模板AreaCenter(ho_ROI_0, &hv_Area, &hv_RowRef, &hv_ColumnRef);ReduceDomain(ho_Image, ho_ROI_0, &ho_ImageReduced);if (HDevWindowStack::IsOpen())SetDraw(HDevWindowStack::GetActive(),"margin");if (HDevWindowStack::IsOpen())DispObj(ho_Image, HDevWindowStack::GetActive());hv_Rows = HTuple();hv_Cols = HTuple();CreateNccModel(ho_ImageReduced, "auto", -0.39, 0.79, "auto", "use_polarity", &hv_ModelID);while (0 != 1){GrabImageAsync(&ho_Image, hv_AcqHandle, -1);//Image Acquisition 01: Do somethingFindNccModel(ho_Image, hv_ModelID, 0, 360, 0.5, 1, 0.5, "true", 0, &hv_Row, &hv_Column, &hv_Angle, &hv_Score);if (0 != ((hv_Score.TupleLength())>0)){hv_Rows = hv_Rows.TupleConcat(hv_Row);hv_Cols = hv_Cols.TupleConcat(hv_Column);if (HDevWindowStack::IsOpen())DispObj(ho_Image, HDevWindowStack::GetActive());dev_display_ncc_matching_results(hv_ModelID, "green", hv_Row, hv_Column, hv_Angle, 0);if (HDevWindowStack::IsOpen())DispObj(ho_Image, HDevWindowStack::GetActive());//dev_display (RegionAffineTrans)}}CloseFramegrabber(hv_AcqHandle);}

2.MFC实现与Halcon混合编程

在Visual Studio 2015中运用C++运用HAlcon需要配置Halcon环境,如何配置环境可参考:
Halcon与MFC的混合编程–VC++环境配置
“https://blog.csdn.net/qq_40896597/article/details/109703054?spm=1001.2014.3001.5502”

配置好环境之后,新建MFC项目,界面编辑如下:

“采集并建立模板” 的事件和运行 “模板匹配” 的部分代码如下:

//建立模板
void CModel_MatchDlg::OnBnClickedBtnSetModel()
{// TODO: 在此添加控件通知处理程序代码HTuple  hv_Width1;HTuple  hv_Height1; //选取的模板图片尺寸//Image Acquisition 01: Code generated by Image Acquisition 01OpenFramegrabber("DirectShow", 1, 1, 0, 0, 0, 0, "default", 8, "gray", -1, "false","default", "[0] ", 0, -1, &hv_AcqHandle);GrabImageStart(hv_AcqHandle, -1);//while (true)GrabImageAsync(&ho_Image, hv_AcqHandle, -1);//这里是在Halcon中选定的模板具体信息。需要修改GenRectangle2(&ho_ROI_0, 420.672, 464.5, HTuple(-81.1412).TupleRad(), 103.896,51.3797);AreaCenter(ho_ROI_0, &hv_Area, &hv_Row, &hv_Column);ReduceDomain(ho_Image, ho_ROI_0, &ho_ImageReduced);GrabImageAsync(&ho_Image, hv_AcqHandle, -1);GetImageSize(ho_ImageReduced, &hv_Width1, &hv_Height1);SetPart(m_HWindowID2, 0, 0, hv_Height1, hv_Width1);DispObj(ho_ImageReduced, m_HWindowID2);if (HDevWindowStack::IsOpen())SetDraw(HDevWindowStack::GetActive(), "margin");if (HDevWindowStack::IsOpen())DispObj(ho_ImageReduced, HDevWindowStack::GetActive());hv_Rows = HTuple();hv_Cols = HTuple();//创建模板CreateNccModel(ho_ImageReduced, "auto", -0.39, 0.79, "auto", "use_polarity",&hv_ModelID);CloseFramegrabber(hv_AcqHandle);}

部分识别模板的代码如下:

//识别模板
if (pDlg->ModelMatch){FindNccModel(pDlg->ho_Image, pDlg->hv_ModelID, 0, 360, 0.5, 1, 0.5, "true", 0, &pDlg->hv_Row, &pDlg->hv_Column,&pDlg->hv_Angle, &pDlg->hv_Score);if (0 != ((pDlg->hv_Score.TupleLength())>0)){pDlg->hv_Rows = pDlg->hv_Rows.TupleConcat(pDlg->hv_Row);pDlg->hv_Cols = pDlg->hv_Cols.TupleConcat(pDlg->hv_Column);if (HDevWindowStack::IsOpen())DispObj(pDlg->ho_Image, HDevWindowStack::GetActive());pDlg->dev_display_ncc_matching_results(pDlg->hv_ModelID, "green", pDlg->hv_Row, pDlg->hv_Column, pDlg->hv_Angle,0);if (HDevWindowStack::IsOpen())DispObj(pDlg->ho_Image, HDevWindowStack::GetActive());                              }}

3.实现效果

MFC与Halcon的混合编程之基于相关性的模板匹配

具体效果视频请见:https://www.bilibili.com/video/BV1Di4y1N7RD/

源代码传送地址:https://download.csdn.net/download/qq_40896597/15728138

MFC与Halcon混合编程--基于相关性的模板匹配相关推荐

  1. 基于相关性的模板匹配NCC

    (一)根本思想 是一种基于统计学计算两组样本数据相关性的算法,其取值范围为[-1, 1]之间 (二)原理 对图像来说,每个像素点都可以看出是RGB数值,这样整幅图像就可以看成是一个样本数据的集合,如果 ...

  2. 基于Halcon学习的基于灰度值模板匹配【一】exhaustive_match.hdev例程

    * 模板与图像的匹配 read_image (Image, 'fabrik') gen_rectangle1 (Rectangle, 365, 300, 390, 330) *将图像的定义域缩小为创建 ...

  3. 基于opencv的模板匹配详解

    1.什么是模板匹配 在OpenCV教程中这样解释模板匹配: 模板匹配是一项在一幅图像中寻找与另一幅模板图像最匹配(相似)部分的技术.这里说的模板是我们已知的小图像,模板匹配就是在一副大图像中搜寻目标. ...

  4. matlab与vc混合编程指导书.doc,vc与matlab混合编程—基于com.doc

    vc与matlab混合编程-基于com.doc VC与MATLAB混合编程基于COM2010年03月21日星期日1118注意旨在提供一份VC调用MATLAB的快速试验参考和一些实际经验,不保证所有内容 ...

  5. C#与Halcon混合编程调用笔记本摄像头

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.通过Halcon导出项目 二.在C#中调用Halcon 1.新建WindForm项目 2.添加HWindowCon ...

  6. HALCON基于形变的模板匹配实现

    基于形变的模板匹配 先看匹配结果: 下面是HALCON的代码,用匹配助手生成的,现在得到的就是模板上61个点的坐标,还有仿射矩阵,利用仿射矩阵可以算出61个点匹配上的像素坐标. * * Matchin ...

  7. 使用OpenCV实现Halcon算法(3)基于轮廓的模板匹配

    声明:本篇仅仅是分享网上的开源项目,算法非本人原创. 〇.算法效果展示 0.1要定位的模板一 找到的匹配 在有污损情况下找到的匹配 0.2要定位的模板2 找到的匹配 一. 理论部分 模板匹配的算法包括 ...

  8. Qt与halcon联合开发实现基于形状的模板匹配

    目录 前言 一.基于形状的模板匹配是什么? 二.具体实现 1.算子介绍 2.关键代码实现 总结 前言 第一次在CSDN写博客,准备写一个简单的形状匹配算子的用法及实现的介绍. 一.基于形状的模板匹配是 ...

  9. Halcon 第五章『模板匹配Matching』◆第5节:基于组件的模板匹配|Component-Based

    一.介绍 基于组件的模板匹配是基于形状匹配的一种应用,也可以说是基于形状的模板匹配的加强版,加强的地方在于,这种方法允许模板中包含多个目标,并且允许目标之间存在相对运动(位移和旋转).区别在于基于形状 ...

最新文章

  1. CSU 1081集训队分组(搜索)
  2. TensorFlow 中文文档 介绍
  3. 图像处理实战 多张曲线同图共舞
  4. 列表(list)之一定义 添加 删除 排序 反转 索引等其他操作
  5. 计算机应用基础分析与报告,y计算机应用基础出题分析报告.doc
  6. 【php复习之】php创建数组的几种方式
  7. 【渝粤教育】广东开放大学 建筑工程施工 形成性考核 (58)
  8. 从wordpress到octopress
  9. 红橙Darren视频笔记 仿QQ步数计数view 画笔的使用
  10. [原]Jenkins(二十一) jenkins再出发Build periodically和Poll SCM
  11. 如何在ADS使用VerilogA模型,并扫描参数
  12. 正则html标签sublime,sublimetext 使用正则表达式匹配中文
  13. 分享铝合金车身的焊接和修复技巧,建议收藏!!!
  14. 服务器怎么多开虚拟机,服务器多开虚拟机操作系统
  15. 如何防止游戏通讯数据被篡改
  16. pytorch 模型微调
  17. 跨月作废发票,红字冲红注意事项 如何整理上交发票
  18. ShareSDK 抖音平台注册
  19. eclipse32位和64位的区别
  20. FL Studio20.9序列号账户注册教程

热门文章

  1. Win7项目分享part1:Windows7准备的3个阶段
  2. 【Appium】元素探测工具UIautomatorViewer 和Appium destop内置工具
  3. 取消WPS对pdf文件的强制文件默认关联
  4. 常用的图像特征有颜色特征、纹理特征、形状特征、空间关系特征。
  5. 软件推广样例:爱情银行APP日流超50w原因分析
  6. 区块链开源技术公司秘猿科技获招银国际Pre-A轮投资
  7. python判断能否组成三角形_【python+任意输入3个数+判断能否组成三角形】 - #1
  8. Linux安装部署MinDoc详细记录
  9. CSDN博客——如何进入专栏并创建自己的专栏
  10. 渗透测试服务 甲方公司OA网站系统漏洞测试