我有一张图像的图像,内部图像是倾斜的,并有自己的坐标表(边缘可见):
现在我需要将实际图像的一个点转换为倾斜图像上的(x cm, y cm)
点。说,我想知道实际图像左下角((x cm, y cm)
)的(0, img.height())
坐标是什么。也就是说,如果要外推内部图像的坐标表。
我已经知道了:
a
p1
和p2
p1cm
和p2cm
我可以通过比较两个点并获得它们的cm距离和实际距离之间的比率来获得图像的比例:
double dCmX = p1cm.x() - p2cm.x();
double dCmY = p1cm.y() - p2cm.y();
double dCm = sqrt(pow(dCmX, 2) + pow(dCmY, 2))
double dPointX = p1.x() - p2.x();
double dPointY = p1.y() - p2.y();
double dPoint = sqrt(pow(dPointX, 2) + pow(dPointY, 2))
double scale = dPoint / dCm;
但我不知道如何以cm坐标获得左下角的坐标。
答案 0 :(得分:2)
这种转换(仅使用比例和倾斜角度)称为仿射变换。为简单起见,您可能希望使用OpenCV
库。然后代码非常简单:
double scale = dPoint / dCm;
Point center = Point( img.cols/2, img.rows/2);
Mat warpMat = getRotationMatrix2D( center, angle, scale );
Point2f src[1];
Point2f dst[1];
src[0] = Point2f(src_x, src_y);
transform(src, dst, warpMat);
然后您将在dst
内获得结果。您当然可以使src
数组更大,并立即为transform
方法提供更多点数
有关opencv和仿射变换的更多信息,另请参阅this。
如果您不想使用OpenCV
,您仍然可以查看getRotationMatrix2D
和warpAffine
的文档页面并自行实现,这很简单:< / p>
构建矩阵(warpMat
):
然后,为每个点(x,y)
构建向量[x,y,1]
并在warpMat
和[x,y,1]
之间进行矩阵乘法:
答案 1 :(得分:0)
您正在寻找可以通过矩阵乘法执行的affine Transformation。