将旋转图像坐标上的点转换为容器坐标

Translate a point on a rotated image coordinates to container coordinates

我正在创建一个应用程序,试图使用 EmguCV 在图像中找到三个点。这三个点用于计算我想向用户显示的数字代码的位置。目的是帮助用户缩放和居中该代码,以便允许用户轻松阅读它。代码可以处于不同的角度,旋转图像以正确的方向显示代码非常重要。

我在 ScrollView 中显示图像。我正在做的是在 X 和 Y 中按比例滚动,使图像相对于代码的中心点居中。当我这样做而不旋转图像时效果很好,但是当我旋转图像时我无法计算代码的位置。为了说明问题,我将放两张图片。

在上图中,我们可以看到一个蓝色的点代表代码中心的去本地化。绿色向量表示从图像原点到代码中心的向量。在那种情况下,图像的原点和容器的原点是相同的,所以我可以毫无问题地缩放和居中代码。

为了使代码具有可读性和可读性,我需要将整个图像旋转大约 -120º。在上图 (2) 中,黑色方块表示图像旋转 -120º,其代码点中心(橙色)和矢量表示其原点(绿色)。大红色方块代表容器矩形(网格)。问题是我之前用 EmguCv 计算的点中心的原点在图像的点 (0,0) 中,当我旋转图像时,图像的这个原点 (0,0) 也旋转了。 所以我想计算相对于容器原点(黄色矢量)的代码中心点(橙色点),以便滚动图像并使图像居中以发现代码。

为了计算点平移,我使用矩阵,它适用于缩放变换,但由于原点的旋转不适用于旋转变换。

您需要考虑切割和提取代码部分不是一种选择。 OpenCv 库并不总是可以从图像中提取三个点,有时我无法正确计算位置,因此我需要允许用户滚动图像以找到代码。

图像有 2448x2048 像素,比例为 X,Y 3.0,旋转接近 -120º。

有什么建议吗?

所以你有(x,y)个坐标,什么找(u,v)个坐标

一点几何知识在这里很有帮助。你知道原始图像大小 (w,h) 和旋转角度 θ 即 -120°。您将需要相反的角度 β=180+θ(如下所示),它将数字降低到 0-90 范围。

  • 旋转后的图片大小

    W = a+b = w*COS(β)+h*SIN(β)
    H = d+c = w*SIN(β)+h*COS(β)
    
  • 目标坐标现在通过移动找到(x,y)坐标的原点坐标相对于新原点位于(W,c)处。从那里 (x,y) 矢量只是相应地旋转以获得新坐标:

    u = W - y*SIN(β) - x*COS(β)
    v = c - y*COS(β) + x*SIN(β)