Расчет поворота изображения на 2 балла - PullRequest
0 голосов
/ 26 мая 2018

У меня есть следующее изображение:

enter image description here

Я хотел бы повернуть изображение таким образом, чтобы 2 точки были на одной линии.

Нижние точки глаз должны быть на одном и том же "уровне".

Как определить, на какую степень мне нужно повернуть изображение?

Iпопробовал функцию 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 голосов
/ 26 мая 2018

Если у вас есть координаты этих двух точек, и если соотношение сторон этих координат является взаимно-однозначным, и если система координат определена так, что перемещение вправо увеличивает первую (x) координату, а движение вверх увеличиваетсявторая (y) координата, и если первая точка (x1, y1) является самой левой из этих двух точек, большинство компьютерных языков могут вычислить желаемый угол на

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

Поворот изображения на эту величинуугол по часовой стрелке установит две точки горизонтально друг к другу.Если возвращаемый угол отрицательный, измените его на положительный и поверните против часовой стрелки.

Обратите внимание, что несколько языков меняют координаты x и y, и большинство языков возвращает угол в радианах.(Если вам нужны градусы, умножьте получаемый угол в радианах на 180, а затем разделите на pi.) Если какое-либо из моих заявленных предположений неверно, эту формулу необходимо будет соответствующим образом скорректировать. Если у вас есть более подробная информация по любомуИз этих предположений, дайте мне знать, и я смогу скорректировать формулу для вас.


(Добавлено после попытки спрашивающего.)

Как я только что подчеркнул в моем оригиналеответ, моя формула зависит от нескольких предположений, являющихся правдой.Теперь, когда вы показали подробности своей попытки, я вижу, что два из предположений неверны.

Самое важное, одно из предположений «движение вверх увеличивает вторую (y) координату», что является стандартом для евклидовагеометрия.Во многих графических средах координата увеличивающейся секунды (y) перемещается на вниз , и ваш пример показывает, что это именно то, что вам нужно.С этим предположением измените мою формулу на

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

Обратите внимание, что я поменял местами y1 и y2, что фактически заменяет каждое из них отрицательным.

Второе предположение«первая точка (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 в эти дни.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...