计算图像旋转2点

时间:2018-05-26 19:46:03

标签: .net math geometry

我有以下图片:

enter image description here

我想以这两个点在同一条线上的方式旋转图像。

眼睛的最低点应该在同一“水平”。

我如何确定旋转图像的程度?

我已按照建议尝试了atan2功能,但这不会产生所需的角度。我用旋转功能和Photoshop测试了它。

我得到了以下结果:

pt1 = {X = 421 Y = 350}
pt2 = {X = 241 Y = 325}
angle = -3.0035866299322738 (calculated with the atan2 function as proposed in one answer)

导致此轮换: enter image description here

以角度-3旋转后,绿线应该是完全笔直的,但事实并非如此,所以我不知道这里的罪魁祸首在哪里。

也许我的轮换代码不正确。

这是我的轮换代码:

Public Function RotateImage(ByVal uBmp As Bitmap, ByVal uAngle As Double) As Bitmap

    ' //create a New empty bitmap to hold rotated image
    Dim nBmp As Bitmap = New Bitmap(uBmp.Width, uBmp.Height)
    nBmp.SetResolution(uBmp.HorizontalResolution, uBmp.VerticalResolution)

    '//make a graphics object from the empty bitmap
    Using g As Graphics = Graphics.FromImage(nBmp)

        ' //Put the rotation point in the center of the image
        ' rotate aroung the center of the image
        g.TranslateTransform(uBmp.Width \ 2, uBmp.Height \ 2)

        'rotate
        g.RotateTransform(uAngle)

        g.TranslateTransform(-uBmp.Width \ 2, -uBmp.Height \ 2)

        ' //draw passed in image onto graphics object
        g.DrawImage(uBmp, New PointF(0, 0))
    End Using

    Return nBmp

End Function

这是一个简单的检查:

使用在线工具绘制角度,我得到了以下图像:

enter image description here

我确定了2分: pt1位于(0,0) pt2位于(120,33)

在线工具的角度为15°。

但是atan2函数返回的角度= 0.26836621090590684。

我怎么能让我的15°回来?

1 个答案:

答案 0 :(得分:1)

如果您有这两个坐标的坐标,并且这些坐标的纵横比是一对一的,并且如果定义坐标系使得向右移动增加第一个(x)坐标并向上移动增加第二个(y)坐标,如果第一个点(x1,y1)是这两个点中最左边的点,大多数计算机语言都可以通过

计算出你想要的角度
angle = atan2(y2 - y1, x2 - x1)

顺时针旋转图像,将两个点相互水平放置。如果返回的角度为负,则将其更改为正并逆时针旋转。

请注意,有几种语言可以交换x和y坐标,大多数语言都会以弧度为单位返回角度。 (如果你需要度数,则将得到的弧度角乘以180然后除以pi。)如果我所述的任何假设都是假的,则需要相应地调整该公式。如果你有更多细节任何这些假设,让我知道,我可以为你调整公式。

(在提问者尝试之后添加。)

正如我在原始答案中所强调的那样,我的公式取决于多个假设是正确的。现在你已经展示了你的尝试的细节,我发现有两个假设是假的。

最重要的是,一个假设是'#34;向上移动会增加第二个(y)坐标,"这是欧氏几何的标准。许多图形环境都有越来越多的第二个(y)坐标移动向下,您的示例显示了您的情况。有了这个假设,将我的公式改为

angle = atan2(y1 - y2, x2 - x1)

请注意,我交换了y1y2,这实际上取代了每个人的负数。

第二个假设是"第一个点(x1,y1)是这两个点中最左边的。"在您的示例中,第一个点是最右侧点,而不是最左侧。如果第一个点有一个更大的x坐标,你应该编写例程来交换点。

通过这些更改,您的积分是

pt1 = {X = 241 Y = 325}
pt2 = {X = 421 Y = 350}

并使用公式angle = atan2(y1 - y2, x2 - x1)给出结果

-0.13800602365751946

该角度为负,因此将图片逆时针旋转角度0.13800602365751946弧度,即7.907162702958458度。

试一下,看看它是否有效。我不懂你的语言(是VB.NET吗?)所以我不能评论你的代码或为你的环境显示你的代码。我这些天用Python编程。