【问题标题】:Translate a point on a rotated image coordinates to container coordinates将旋转图像坐标上的点转换为容器坐标
【发布时间】:2021-11-17 18:52:51
【问题描述】:

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

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

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

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

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

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

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

有什么建议吗?

【问题讨论】:

  • 您能否展示一些您正在使用的数据结构,以便我们尝试使解决方案适合您的框架?

标签: c# geometry trigonometry emgucv


【解决方案1】:

所以你有(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(β)
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-03
    • 1970-01-01
    相关资源
    最近更新 更多