найти соответствующую точку на повернутом изображении

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

Дополнительные баллы за решение, которое работает независимо от ротации.

Original Image ( 1920 x 1280 )     Rotated View ( for display on phone )
+----------------------------+     +-----------------+
|(0,0)                       |     |(0,0)            |  ( 1280 x 1920 )
|                            |     |                 |
|                            |     |       x         |
|    x                       |     |    ( click )    |
|    ( what is this point )  |     |                 |
|                            |     |                 |
|                            |     |                 |
+----------------------------+     |                 |
                      (1920,1280)  |                 |
                                   |                 |
                                   |                 |
                                   |                 |
                                   |                 |
                                   |                 |
                                   |                 |
                                   |                 |
                                   +-----------------+
                                                      (1280,1920)

ОБНОВЛЕНО


    /*
    This is how I build the matrix used to perform the initial rotation from the original to     the rotated image. This matrix also includes scaling 

    Code base: Android/Java
    bitmap ( bitmap i'm scaling/rotating )
    canvas ( the canvas being drawn to )

    Note: bitmap is in landscape mode / canvas is in portrait

    */

    Matrix matrix = new Matrix();
    float centerX = canvas.getWidth() >> 1;
    float centerY = canvas.getHeight() >> 1;

    rAngle = 90;
    scaleH = ((float) canvas.getHeight()) / bitmap.getWidth();
    scaleW = ((float) canvas.getWidth()) / bitmap.getHeight();

    scaler.preScale(scaleH, scaleW);
    scaler.postRotate(rAngle, centerY, centerX);

    float nx = (canvas.getHeight() - canvas.getWidth()) / 2;
    scaler.postTranslate(-nx, nx);

    canvas.drawBitmap(bitmap,scaler,null);

Я вряд ли разбираюсь в математике, поэтому любая рука будет оценена. :)


person meetri    schedule 12.03.2014    source источник
comment
Я думаю, вам нужно хотя бы обозначить координаты углов ваших прямоугольников. Я немного смущен тем, почему правый верхний угол одного прямоугольника будет (0, 0), а (0, 1280) в другом. (Или, может быть, это верхний левый. Я не уверен.)   -  person beaker    schedule 12.03.2014
comment
мои извинения, я хотел сказать, что верхний левый (0,0) в повернутом виде. Я обновил свой пост, чтобы отразить это.   -  person meetri    schedule 12.03.2014
comment
Что вы знаете о ротации? Если у вас есть матрица вращения, вы можете просто преобразовать точку из повернутого изображения с помощью обратной этой матрицы вращения....   -  person Marco13    schedule 12.03.2014
comment
@ Marco13 Marco13 Это сработает, но вы должны помнить, что после этого нужно перевести по максимальной координате Y. В противном случае вы получите отрицательные значения Y.   -  person beaker    schedule 12.03.2014
comment
если кто-нибудь может предоставить мне формулу для использования, было бы здорово! Проблема, с которой я сталкиваюсь сейчас, заключается в том, что я получаю отрицательные числа, когда просто пытаюсь повернуть свою точку на 90 градусов вокруг центра повернутого вида. Я могу опубликовать числа, которые я получаю после моего вращения, чтобы увидеть, близко ли я или на правильном пути, если это поможет.   -  person meetri    schedule 12.03.2014
comment
Конечно, опубликуйте текущую матрицу вращения.   -  person beaker    schedule 12.03.2014
comment
я обновил свой пост своим кодом, который выполняет исходное преобразование из исходного в повернутое. (возможно, некоторая помощь в инвертировании процесса решит мою проблему)   -  person meetri    schedule 12.03.2014
comment
Я думаю, что смог решить свою проблему. я использовал этот ответ stackoverflow.com/a/7418428/1116784, чтобы выполнить обратную исходную матрицу. Спасибо @Marco13 за то, что указал мне правильное направление в этом вопросе.   -  person meetri    schedule 12.03.2014


Ответы (1)


Нижний индекс O указывает координаты в исходном кадре, а нижний индекс R в повернутом кадре:

XO = YR
YO = maxXR - XR

Четыре угла кадра дают нам:

Для верхнего левого угла в повернутом кадре (0,0)

XO = 0
YO = 1279 - 0 = 1279
(0, 1279)

В правом верхнем углу (1279, 0):

XO = 0
YO = 1279 - 1279 = 0
(0, 0)

Для нижнего левого (0, 1919):

XO = 1919
YO = 1279 - 0 = 1279
(1919, 1279)

В правом нижнем углу (1279, 1919):

XO = 1919
YO = 1279 - 1279 = 0
(1919, 0)

person beaker    schedule 12.03.2014