我正在使用 OpenCV 中的仿射变换,我无法直观地理解它的工作原理,更具体地说,我如何指定映射矩阵的参数,以便获得特定的所需结果。
为了设置这个问题,我使用的过程是首先定义一个扭曲矩阵,然后进行变换。
在 OpenCV 中,这两个例程是(我在 Bradski & Kaehler 的优秀书籍 OpenCV 中使用了一个示例):
cvGetAffineTransorm(srcTri, dstTri, warp_matrix);
cvWarpAffine(src, dst, warp_mat);
定义warp矩阵,srcTri
定义dstTri
为:
CvPoint2D32f srcTri[3], dstTri[3];
srcTri[3]
填充如下:
srcTri[0].x = 0;
srcTri[0].y = 0;
srcTri[1].x = src->width - 1;
srcTri[1].y = 0;
srcTri[2].x = 0;
srcTri[2].y = src->height -1;
这本质上是图像的左上点、右上点和左下点作为矩阵的起点。这部分对我来说很有意义。
但是 just 的值dstTri[3]
令人困惑,至少,当我改变一个点时,我没有得到我期望的结果。
例如,如果我随后将以下内容用于dstTri[3]
:
dstTri[0].x = 0;
dstTri[0].y = 0;
dstTri[1].x = src->width - 1;
dstTri[1].y = 0;
dstTri[2].x = 0;
dstTri[2].y = 100;
src 和 dst 点之间的唯一区别似乎是左下点向右移动了 100 个像素。直觉上,我觉得图像的底部应该向右移动 100 像素,但事实并非如此。
dstTri[3]
此外,如果我使用与for完全相同的值srcTri[3]
,我会认为转换会产生完全相同的图像——但事实并非如此。
显然,我不明白这里发生了什么。那么,从srcTri[]
到的映射dstTri[]
代表什么?