vector < Point2f >
patch_models::calc_peaks (const Mat & im,
const vector < Point2f > & points, const Size ssize)
参照warpAffine解析http://blog.youkuaiyun.com/limit_ing/article/details/62091088
vector < Point2f > pts = this -> apply_simil (Si, points);
for (int i = 0; i < n;
i++) {Size wsize = ssize + patches[i].patch_size ();
Mat A (2, 3, CV_ 32 F);
A.fl (0, 0) = S.fl (0, 0); A.fl (0, 1) = S.fl (0, 1);
A.fl (1, 0) = S.fl (1, 0); A.fl (1, 1) = S.fl (1, 1);
A.fl (0, 2) =
pt.fl (2*i) - (A.fl (0, 0)*(wsize.width - 1)/2 +
A.fl (0, 1)*(wsize.height - 1)/2);
A.fl (1, 2) =
pt.fl (2*i + 1) - (A.fl (1, 0)*(wsize.width - 1)/2 +
A.fl (1, 1)*(wsize.height - 1)/2);
Mat I;
warpAffine (im, I, A, wsize, INTER_LINEAR + WARP_INVERSE _MAP);
Mat R = patches[i].calc_response (I, false); // 得到最佳匹配的位置,
匹配到的点是在标准的尺度和旋转坐标下的坐标系值,所以下面要变换回来;
Point maxLoc; minMaxLoc (R, 0, 0, 0, & maxLoc); //
把旋转到标准点的坐标偏移移动到匹配坐标上,这时候的尺度是标准的尺度;
pts[i] =
Point2f (pts[i].x + maxLoc.x - 0.5*ssize.width,
pts[i].y + maxLoc.y - 0.5*ssize.height);
这一段和块匹配模型最后一段一致是得到最匹配的点的位置,但是这点是在以标准空间缩放旋转后的图片,而不是原图
这边使用this -> apply_simil (S, pts); // 计算偏移后的点的位置,就是校正后的点;
也就是使用S矩阵将其映射回原来的图像的位置坐标上