【问题标题】:Convert a point on an inclined image to a non-inclined point将倾斜图像上的点转换为非倾斜点
【发布时间】:2016-08-24 07:00:18
【问题描述】:

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

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

我已经知道了:

  • 倾斜图像的角度a
  • 从倾斜图像中手动选择两个点 p1p2
  • 这两点的厘米坐标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;

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

【问题讨论】:

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


【解决方案1】:

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

构建矩阵 (warpMat):

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-15
      • 1970-01-01
      • 2013-07-19
      • 1970-01-01
      • 2021-11-09
      • 2020-04-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多