gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 02:15:06 25 4
gpt4 key购买 nike

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

enter image description here

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

我已经知道了:

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

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

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;

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

最佳答案

这种变换(仅使用比例和倾斜角度)称为仿射变换。你可能想使用 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 一次处理更多点。
另见 this有关 opencv 和仿射变换的更多信息。


如果你不想使用OpenCV您仍然可以查看 getRotationMatrix2D 的文档页面和 warpAffine 自己实现,很简单:

enter image description here

构建矩阵(warpMat):

enter image description here

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

enter image description here

关于c++ - 将倾斜图像上的点转换为非倾斜点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39116448/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com