将倾斜图像上的点转换为非倾斜点

时间:2016-08-24 07:00:19

标签: c++ image image-processing coordinates coordinate-transformation

我有一张图像的图像,内部图像是倾斜的,并有自己的坐标表(边缘可见):

enter image description here

现在我需要将实际图像的一个点转换为倾斜图像上的(x cm, y cm)点。说,我想知道实际图像左下角((x cm, y cm))的(0, img.height())坐标是什么。也就是说,如果要外推内部图像的坐标表。

我已经知道了:

  • 倾斜图像的角度a
  • 从倾斜图片中手动选择两个点p1p2
  • 这两个点的厘米坐标p1cmp2cm

我可以通过比较两个点并获得它们的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​​坐标获得左下角的坐标。

2 个答案:

答案 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,您仍然可以查看getRotationMatrix2DwarpAffine的文档页面并自行实现,这很简单:< / p>

enter image description here

构建矩阵(warpMat):

enter image description here

然后,为每个点(x,y)构建向量[x,y,1]并在warpMat[x,y,1]之间进行矩阵乘法:

enter image description here

答案 1 :(得分:0)

您正在寻找可以通过矩阵乘法执行的affine Transformation