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

Convert a point on an inclined image to a non-inclined point

我有一个图像的图像,其中内部图像是倾斜的并且有自己的坐标 table(在其边缘可见):

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

我已经知道了:

我可以通过比较两个点并得到它们的厘米距离与实际距离之间的比率来得到图像的比例:

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;

但我不知道如何以厘米坐标获取左下角的坐标。

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

这种变换(仅使用比例和倾斜角度)称为仿射变换。为简单起见,您可能希望使用 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 and warpAffine的文档页面自己实现,很简单:

构建矩阵(warpMat):

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