Android SDK: получить предварительный просмотр изображения камеры без его отображения

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

По ответам на эту веткуФотосъемка с камеры без предварительного просмотра это было невозможно в Android 1.5, но кто-нибудь знает, возможно ли это в Android 4 (уровень API 15)?

 user369357618 июн. 2014 г., 12:40
Только что попробовал фиктивное решение SurfaceTexture (метод 2) на Samsung Galaxy s5. Это терпит неудачу после нескольких кадров. Мой обходной путь - на самом деле вызвать updateTexImage, но использовать недопустимое имя текстуры с допустимым контекстом GL. После отключения полученного исключения все работает гладко.

Ответы на вопрос(3)

ы работать с этим в NDK, так как использование интерфейса Java сведет на нет любое повышение производительности. Необходимость работать с PixelBuffer абсолютно безумна с точки зрения производительности. Ваше преобразование из RGBA888 в YUV также должно быть сделано в C.

Не пытайтесь использовать TextureView, так как это будет еще хуже. Вам нужно будет скопировать пиксели в растровое изображение, а затем из растрового изображения в массив, перед преобразованием в YUV. Это само по себе занимает почти 30% загрузки процессора на новом Nexus 7 2013 года.

Самый эффективный способ - напрямую общаться с Camera.h и обходить все API-интерфейсы Android. Вы можете создать свой собственный буфер и перехватывать данные YUV, прежде чем они отправятся куда-либо еще.

 25 нояб. 2013 г., 23:22
Я действительно не уверен, что вы подразумеваете под PixelBuffer - нет API с таким именем, о котором я знаю в Android (вы имеете в виду Bitmap?). Обратные вызовы предварительного просмотра отлично работают с setPreviewTexture () в дополнение к setPreviewDisplay (), и первый не требует предварительного просмотра чертежа для любого элемента пользовательского интерфейса. Я согласен, что копии в собственном и JNI-слоях снижают производительность, поэтому я также предложил подход к обработке на GPU, который не требует дополнительных затрат.
 16 нояб. 2013 г., 00:26
Хотя обратные вызовы предварительного просмотра не так эффективны, как мне бы хотелось, они не так ужасны. Вы получаете байт [] данных YUV на кадр, который может быть отправлен через JNI в собственный код обработки с нулевыми копиями. Нет преобразования в растровое изображение или что-либо еще требуется. Использование Camera.h напрямую - плохая идея, поскольку этот интерфейс является закрытым и может изменяться в любое время.
 27 нояб. 2013 г., 00:16
PixelBuffer - это низкоуровневый буфер, используемый при предоставлении Камере текстуры вместо Поверхности. PixelBuffer поддерживает буфер GL. На самом деле вы можете создать & quot; фальшивку & quot; texure и заставить Camera API загружать необработанные данные в PixelBuffer. Это все скрыто. У android_platform_cts есть пример или два, как это сделать. Мне очень не нравится, как я не могу создавать абзацы здесь.opengl.org/wiki/Pixel_Buffer_Object
 14 янв. 2014 г., 03:09
FWIW, пример захвата предварительного просмотра камеры и сохранения его в виде файла MPEG без отображения чего-либо:bigflake.com/mediacodec/#CameraToMpegTest , Поверхность - это место, куда уходят пиксели; он не обязательно привязан к экранному композитору. Кроме того, для некоторых ограниченных определений «обработки изображений»; (например, преобразование цвета в черно-белое изображение), вы можете делать все это на графическом процессоре, который является настолько эффективным, насколько это возможно.
 24 нояб. 2013 г., 17:47
Обратные вызовы предварительного просмотра работают только с Surface. Вопрос был в том, как это сделать, не отображая его вообще. Единственный способ сделать это без Surface - использовать PixelBuffer. Стандартный обратный вызов с Surface лучше с точки зрения производительности. Каждый обратный вызов имеет два цикла. Камера копирует во внутренний буфер; затем в поверхностный буфер RGBA. Второй цикл копирует внутренний буфер в буфер обратного вызова.
Решение Вопроса

бражения без их отображения на экране является использованиеCamera.setPreviewTexture () вызов, чтобы направить кадры предварительного просмотра в графический процессор.

Вы можете использовать это двумя способами:

Do your actual processing on the GPU: Set up an OpenGL context (OpenGL ES 2 tutorial), and create a SurfaceTexture object in that context. Then pass that object to setPreviewTexture, and start preview. Then, in your OpenGL code, you can call SurfaceTexture.updateTexImage, and the texture ID associated with the SurfaceTexture will be updated to the latest preview frame from the camera. You can also read back the RGB texture data to the CPU for further processing using glReadPixels, if desired. Do your processing on the CPU: You can simply create a dummy SurfaceTexture object without any OpenGL context set up. Pass any integer you want as the texture ID, and connect the SurfaceTexture to the camera using setPreviewTexture. As long as you don't call updateTexImage, the SurfaceTexture will simply discard all data passed into it by the camera. Then set up preview callbacks using setPreviewCallback, and use that data (typically in a YUV format) for CPU processing. This is probably less efficient than #1, but does not require knowing OpenGL.
 14 янв. 2014 г., 03:02
@wobbals: Вы не можете напрямуюglReadPixels() выход камеры (такая же проблема, какstackoverflow.com/questions/19366660/…). Передайте это pbuffer сначала. Некоторые указатели на примеры здесь:stackoverflow.com/questions/20710204/…
 05 окт. 2013 г., 01:44
Метод 2 не работает для Nexus 4.
 14 июн. 2013 г., 01:13
Кто-нибудь сталкивался с простым примером использования glReadPixels после возврата SurfaceTexture.updateTexImage?

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

Могут быть и другие причины, чтобы "скрыть" предварительный просмотр, но имейте в виду, что изначально целью API было убедиться, что конечный пользователь видит все, что поступает с камеры в приложение, из соображений конфиденциальности и безопасности.

Ваш ответ на вопрос