我正在使用OpenCV进行仿射变换,但我在理解其工作原理方面有些困难,尤其是如何指定映射矩阵的参数以获得特定的预期结果。为了提出问题,我首先定义一个变换矩阵,然后进行变换。在OpenCV中,这两个例程分别是(我使用Bradski&Kaehler的优秀书籍OpenCV中的示例):
为了定义warp矩阵,需要定义
似乎源点和目标点之间唯一的区别是左下角的点向右移动了100像素。直觉上,我认为图像的底部应该向右移动100像素,但事实并非如此。
此外,如果我对
显然,我不理解这里发生了什么。那么,从
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;
这基本上是图像的左上点、右上点和左下点,作为矩阵起始点。这部分对我来说很有意义。
但是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;
似乎源点和目标点之间唯一的区别是左下角的点向右移动了100像素。直觉上,我认为图像的底部应该向右移动100像素,但事实并非如此。
此外,如果我对
dstTri [3]
使用完全相同的值,就像我对srcTri [3]
使用的那样,我会认为变换会产生完全相同的图像——但事实并非如此。显然,我不理解这里发生了什么。那么,从
srcTri []
到dstTri []
的映射表示什么?