问题提出:
OpenCV并不像Halcon一样提供带有旋转和缩放的的模板匹配。本文对带旋转和缩放的模板匹配问题进行限定,只针对的目标缩放范围为95%到105%,旋转角度为-5度到5度的情况,尝试用opencv解决。
问题分析:
带有旋转和缩放,首先想到使用外轮廓进行Hu矩匹配,然后根据外轮廓周长比例和面积开方的比例确定缩放系数,根据轮廓最小包围旋转矩形的角度差确定旋转角度。这个思路要求目标外轮廓不能对称,比如圆,正方形,长方形这些,同时最小包围矩形也不能是长宽比较接近的长方形甚至正方形,否则无法确定旋转角度(或者多个可能角度一一使用灰度匹配去判断)。但是本文有个限制条件,缩放比例和旋转角度较小。所以另一个思路是搜索的方法,只要找到一个好的的搜索策略,那么算法的时间也是可以接受的。
实现效果
如下图所示,左边是模板,右边是待匹配的目标,有4度的旋转。
左边是带旋转和污损的目标,右边是匹配结果(叠加模板后找到污损区域)。
思路一:Hu矩
使用Hu矩由于限制较多,不能对实现效果中的图进行处理,因此使用如下模板
要从如下图中找出
代码实现:
Mat searchImage = imread("pic/contour/Search2.jpg");
Mat searchImageResult = searchImage.clone();
Mat graySearchImg;
cvtColor(searchImage, graySearchImg, COLOR_RGB2GRAY);
Mat templateImage = imread("pic/contour/Template2.jpg");
Mat grayTemplateImg;
cvtColor(templateImage, grayTemplateImg, COLOR_RGB2GRAY);
//在Template2和Search2中找外轮廓
Mat bin_search;
threshold(graySearchImg, bin_search, 128, 255, THRESH_BINARY);
vector<vector<Point>> contours_search;
vector<Vec4i> hierarchy_search;
findContours(bin_search, contours_search, hierarchy_search, RETR_TREE, CHAIN_APPROX_NONE, Point(0, 0));
Mat bin_template;
threshold(grayTemplateImg, bin_template, 128, 255, THRESH_BINARY);
vector<vector<Point>> contours_template;
vector<Vec4i> hierarchy_template;
findContours(bin_template, contours_template, hierarchy_template, RETR_TREE, CHAIN_APPROX_NONE, Point(0, 0));
drawContours(searchImage, contours_search, -1, Scalar(255