Android Camera2 рамка горизонтальной инверсии - PullRequest
2 голосов
/ 21 марта 2019

Я хочу по горизонтали инвертировать кадры, поступающие на Surface объект, сделанный из TextureView. Что я могу сделать, это установить матрицу преобразования для этого экземпляра TextureView, тогда как I postScale на -1 для x и 1 для y (оставить без изменений), а затем postTranslate dx на полном ширину вида и оставить dy без изменений (0F).

Но проблема возникает, когда я поворачиваю свое устройство на 90 градусов (по горизонтали) при выключенном повороте экрана: изображение поворачивается на 180 градусов, и это, конечно, имеет смысл, поскольку оси x и y не изменилось.

Как это можно решить? Можно ли поиграть с матрицей перевода таким образом, чтобы решить эту проблему? Или может быть с инструментами OpenGL ES?

P.S .: как ни странно, но вращение выполняется в два раза в два раза больше, чем само вращение устройства, например когда я поворачиваю устройство на 90 градусов - предварительный просмотр поворачивается на 180.

P.S.S .: Я пытался инвертировать предварительный просмотр, используя метод Matrix setPolyToPoly ... и получил точно такой же результат.

P.S.S .: Кроме того, вы играете с open gl, чтобы достичь цели, используя простые преобразования масштаба и поворота для модели и проекции, и получите точно такой же результат!

Обновление:

Это скриншоты, которые описывают поведение фронтальной камеры по умолчанию - HAL по умолчанию применяет инверсию кадров, и я не могу прочитать текст; все равно, поворачиваю ли я устройство или нет - «ориентация кадра» не меняется:

Default behavior in portrait orientation

Default behavior in landscape orientation

И это скриншоты, когда я применяю, например, Matrix.scaleM(modelMatrix, 0, -1F, 1F, 1F); и затем применяю эту матрицу к каждой координате, которая входит в вершинный шейдер, так что теперь я могу читать текст, потому что я сам применил инверсию, так что инверсия HAL с моей собственной инверсией приведет к отсутствию инверсии, но когда я поверну свое устройство (с изменением ориентации устройства при отключенном вращении, конечно, и в этом суть) - я увижу себя перевернутым, и это, конечно, имеет смысл, потому что Система координат устройства не изменится. Тем не менее, я хочу иметь возможность избежать поворота изображения каким-либо образом при повороте самого устройства (как в режиме по умолчанию - независимо от того, повернуто устройство или нет - изображение предварительного просмотра просто «не волнует») и по-прежнему иметь возможность читать текст (я имею в виду, как в портретном режиме).

Customized behavior in portrait mode - works as needed Customized behavior when device is rotated (but configuration is portrait anyway) - flipped upside down instead of horizontally

1 Ответ

1 голос
/ 28 марта 2019

Проводите ли вы свои тесты на передней или задней камере?Обычно по горизонтали необходимо переворачивать только рамку передней камеры, а не заднюю камеру.

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

Обновление # 2

Я только что понял, чтоэта проблема может быть решена, если преобразование применяется в нужный момент в конвейере.Я покажу рабочий пример, он широко использует OpenGL, но я надеюсь, что вы найдете что-то полезное.Смотрите этот фрагмент кода , он использует вершинный шейдер для преобразования координат.В drawFrame() есть звонок на getTransformMatrix().Вместо выполнения этого вызова получите матрицу из этого метода , который я написал при выполнении аналогичной задачи.

...