因为我做的是芯片引脚的共线度检测,需要提取芯片引脚底边中心坐标,所以用的是基于互相关的模板匹配。
相关性原理:首先创建一个模板,把模板里每一个像素当成一个特征,所有像素按列组成一个行向量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()