在定位中通常需要根据目标区域特征在图像中找出其正确的位置。使用比较多的方法还是模板匹配,模板匹配是根据区域的灰度值进行匹配,将结果存储在矩阵中,然后根据模板匹配所使用方法的不同寻找矩阵中最大值或者最小值就是最佳匹配。在opencv中使用cv::matchTemplate(src, temp, result, CV_TM_CCORR_NORMED);算子进行匹配。具体相关的解释见:http://blog.csdn.net/yang_xian521/article/details/6942194。
模板匹配中第一步就需要寻找模板,一般情况下先需要自己手动寻找感兴趣区域进行寻找。可以使用opencv的highgui头文件进行可视化选取,然后再在图像中进行匹配。
但是模板匹配有明显的缺陷。其一鲁棒性较差,对光线或者灰度值比较敏感,所以才出来了许多归一化的模板匹配算法,用来减小光照对模板匹配算法的影响,在前面几节所讲解的直方图反向投影中也可以进行灰度匹配,但是其计算时间比较长。其次,不支持旋转与缩放匹配。这一节首先解决前面的问题,即自选取区域,然后模板匹配。首先看一下opencv中怎样根据鼠标动作自定义区域。
首先鼠标有三个动作,点击、滑动、松开。程序设计为当右键点击并且滑动时选定区域。鼠标监听响应函数为cv::SetMouseCallback().
C++: void setMouseCallback(const string& winname, MouseCallback onMouse, void* userdata=0 )
winname – 监听鼠标的窗口,这要求需要使用cv::namedWindow声明一个窗口。
onMouse – 鼠标操作响应函数.可以看例子http://code.opencv.org/projects/opencv/repository/revisions/master/entry/samples/cpp/ffilldemo. cpp
userdata – 传递给响应函数的参数.
响应函数应该为一下形式
void onMouse(int Event,int x,int y,int flags,void* param )
Event