[Halcon&定位] 基于互相关(NCC)的模板匹配

简介: [Halcon&定位] 基于互相关(NCC)的模板匹配

因为我做的是芯片引脚的共线度检测,需要提取芯片引脚底边中心坐标,所以用的是基于互相关的模板匹配。

相关性原理:首先创建一个模板,把模板里每一个像素当成一个特征,所有像素按列组成一个行向量a,即模板的特征向量。在图像中寻找与模板最匹配的区域b,通过cos\theta=\vec{a}.\vec{b}/|\vec{a}||\vec{b}|,即两个向量之间的夹角来衡量匹配的好坏。说白了,基于互相关其实是一个概率的计算,即通过公式计算roi区域(模板)与待测图之间的相似度。越接近1,两块区域相似度越高。否则,相似度越低。

应用场合:适用于光照不均匀,明暗变化大且背景不能太复杂的场合。适用于光照不均匀,明暗变化大且背景不能太复杂的场合。搜索对象有轻微的变形,大量的纹理,图像模糊等场合,速度快,精度低。

重要函数一:

创建模板:create_ncc_model( Template : : NumLevels, AngleStart, AngleExtent, AngleStep, Metric : ModelID)

参数列表:

Template(in):单通道灰度图像(68),它的区域可被创建为模板

NumLevels(in):金字塔的最大层级,层数越多,搜索的越快。

AngleStart(in):模板的最小旋转

AngleExtent(in):旋转角度范围

AngleStep(in):角度步长

Metric(in):匹配标准默认 ‘use_polarity’ 使用全局,如果图像对比度不好,可用忽略全局’ignore_global_polarity’

ModelID(out):模板句柄,就和自己家的门牌号一样,通过句柄来找到模板图像。

实例:

HTuple Width,Height ,WindowHandle3,Row1, Column1, Row2, Column2;
  HObject GrayImage,roi1;
  ReadImage(&ho_Image, "D:/Data/1.jpg");
    GetImageSize (ho_Image, &Width, &Height);
    OpenWindow(0,0,400,400,0, "","", &WindowHandle3);
    HDevWindowStack::Push(WindowHandle3);
      //需要显示一下,窗口才会更新图片
      if (HDevWindowStack::IsOpen())
    DispObj(ho_Image, HDevWindowStack::GetActive());
      //设置窗口几何对象显示颜色,这个设置一直到下一个SetColor才会改变。
    if (HDevWindowStack::IsOpen())
    SetColor(HDevWindowStack::GetActive(),"red");
      //定义区域的填充模式,有'fill', 'margin'前者是填充全部区域,后者是显示边缘,在显示边缘时可以用
      if (HDevWindowStack::IsOpen())
    SetDraw(HDevWindowStack::GetActive(),"margin");
      //设置线宽
      if (HDevWindowStack::IsOpen())
    SetLineWidth(HDevWindowStack::GetActive(),1);
    //设置在窗口写字的位置
    SetTposition(WindowHandle3, 24, 12);
    WriteString(WindowHandle3, "请用鼠标画ROI");
    //画不带方向的roi矩形框,2是带方向的
  DrawRectangle1(WindowHandle3, &Row1, &Column1, &Row2, &Column2);
  //生成矩形框
    GenRectangle1(&ho_ModelRegion, Row1, Column1, Row2, Column2);
    //用上面的矩形抠图,生成roi区域
    ReduceDomain(ho_Image, ho_ModelRegion, &ho_TemplateImage);
    //创建模板
    CreateNccModel(ho_TemplateImage, "auto", HTuple(0).TupleRad(), HTuple(20).TupleRad(), 
    "auto", "use_polarity", &hv_ModelId);

重要函数二:

寻找模板:find_ncc_model(Image : : ModelID, AngleStart, AngleExtent, MinScore, NumMatches, MaxOverlap, SubPixel, NumLevels : Row, Column, Angle, Score)

参数列表:

Image(in):单通道图像,它的区域可被创建为模板

ModelID(in):模板句柄

AngleStart(in):模板的最小旋转

AngleExtent(in):旋转角度范围

MinScore(in):被找到的模板最小分数,该值越大,算法速度越快,但是也越不容易找到目标(比如高考分数线越高,考上的就越少,统计考上的人数也就越快)

NumMatches(in):被找到的模板个数,限制找到的模板个数,默认为零

MaxOverlap(in):被找到的模板实例最大重叠部分,越接近于1时,图像有一些遮挡也可以找到。越接近于0时,图像有一些遮挡会找不到

SubPixel(in):亚像素级别标志,true,false

NumLevels(in):金字塔层级数,级数越多,搜索速度越快,但准确度会下降。

Row(out):被找到的模板实例行坐标

Column(out):被找到的模板实例列坐标

Angle(out):被找到的模板实例的旋转角度

Score(out):被找到的模板实例的分数,分数越高,找到的图像与模板越接近。

重要函数三:

释放模板:clear_ncc_model()

目录
相关文章
|
6月前
|
人工智能 Linux API
OpenCV这么简单为啥不学——1.1、图像处理(灰度图、模糊图片、GaussianBlur函数、提取边缘、边缘膨胀、边缘细化)
OpenCV这么简单为啥不学——1.1、图像处理(灰度图、模糊图片、GaussianBlur函数、提取边缘、边缘膨胀、边缘细化)
104 0
|
6月前
|
机器学习/深度学习 文字识别 算法
[Halcon&图像] 缺陷检测的一些思路、常规检测算法
[Halcon&图像] 缺陷检测的一些思路、常规检测算法
1982 1
|
5月前
|
移动开发 算法 计算机视觉
技术笔记:openCV特征点识别与findHomography算法过滤
技术笔记:openCV特征点识别与findHomography算法过滤
98 0
|
6月前
|
编解码 算法 图形学
LabVIEW中调整图像大小
LabVIEW中调整图像大小
81 0
|
机器学习/深度学习 人工智能 算法
LabVIEW深度相机与三维定位实战(三)
立体匹配与ACV算法理论知识
139 0
LabVIEW深度相机与三维定位实战(三)
|
6月前
|
C++
[Halcon&定位] 解决Roi区域外的模板匹配成功
[Halcon&定位] 解决Roi区域外的模板匹配成功
207 0
|
机器学习/深度学习 人工智能 算法
LabVIEW深度相机与三维定位实战(四)
立体匹配与ACV算法在LabVIEW中的调用
113 0
LabVIEW深度相机与三维定位实战(四)
|
机器学习/深度学习 传感器 编解码
LabVIEW实现深度相机与三维定位实战(二)
LabVIEW实现深度相机与三维定位实战(二)
228 0
LabVIEW实现深度相机与三维定位实战(二)
|
机器学习/深度学习 传感器 编解码
LabVIEW实现深度相机与三维定位实战(一)
LabVIEW实现深度相机与三维定位实战(一)
291 0
LabVIEW实现深度相机与三维定位实战(一)
|
数据可视化 C++
【影像配准】配准之棋盘网格图(镶嵌图像)(附有 C++ 代码)
【影像配准】配准之棋盘网格图(镶嵌图像)(附有 C++ 代码)
下一篇
无影云桌面