ОБНОВЛЕНИЕ: вопрос о Camera2

Я пытаюсь выяснить, кто применяет преобразование вращения, когда предварительный просмотр камеры рисуется на SurfaceTexture.

При запросе размеров предварительного просмотра с камеры вы всегда получаете пары, у которых ширина больше, чем высота (поскольку при съемке изображения обычно используется горизонтальная ориентация).

При использовании устройства в портретном режиме и установке размера предварительного просмотра (например, 1600 x1200) кадры с камеры правильно поворачиваются, но я не могу определить, где это сделано, это то, что CameraDevice делает автоматически на основе Тип поверхности? или SurfaceTexture поворачивает изображение?

1
Stelian Morariu 28 Май 2017 в 13:21

2 ответа

Лучший ответ

Ответ немного зависит от того, какой API камеры вы используете; поскольку вы упоминаете CameraDevice, я предполагаю, что вы имеете в виду camera2.

В camera2 одной из целей было, по возможности, упростить обработку вращения; поэтому, если вы рисуете предварительный просмотр в SurfaceView, сервис камеры и аппаратный композитор / графический процессор взаимодействуют и обрабатывают все вращения за вас. Вы всегда запрашиваете разрешение ландшафта у сенсора (который выровнен по длинному краю сенсора, совпадающему с длинным краем устройства), и вам просто нужно убедиться, что соотношение сторон вашего SurfaceView соответствует требуемому соотношению сторон (так в портретной ориентации, для правильного отображения 1080p необходимо изображение 9:16; в альбомной ориентации необходимо изображение 16: 9).

Для TextureView и полностью настраиваемого рисования GL с SurfaceTexture API не может сделать все это за вас. Преобразование SurfaceTexture устанавливается API-интерфейсом камеры для поворота выходного сигнала камеры в исходную ориентацию устройства (обычно портретная ориентация для телефонов, альбомная ориентация для некоторых планшетов), но он не может обрабатывать дополнительное вращение, если пользовательский интерфейс вашего приложения не находится в исходной ориентации. ,

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

2
Eddy Talvala 29 Май 2017 в 01:09

Прошло около года с тех пор, как я работал над камерой, поэтому я прошу прощения за отсутствие деталей. Но я помню, что ключ при отображении предварительного просмотра камеры вычислял правильную матрицу преобразования для применения к SurfaceView (или TextureView) для применения любого необходимого масштабирования или поворота. Что касается того, «кто делает вращение», я думаю, вы можете сказать, что это представление, как указано в преобразовании, которое вы предоставляете. Таким образом, матрица будет основана на соотношении разрешения предварительного просмотра, которое вы запрашиваете (из списка возможностей вашего устройства), в сравнении с фактическими размерами вашего обзора, плюс физическая ориентация датчика устройства по сравнению с текущим ориентация экрана устройства.

В старом API камеры Camera.CameraInfo имеет поле ориентации, которое задает физическую ориентацию, с которой монтируется датчик. Как правило, это 90 для датчика, установленного в альбомной ориентации на большинстве телефонов, но вы также найдете около 270 с (фактически «вверх ногами»). 0 и 180 могут существовать, но я их никогда не видел.

0
Wilhelm 28 Май 2017 в 23:15