Как установить разрешение камеры в Android с OpenCV?

Я пытаюсь разработать приложение для Android, и мне нужно будет получить несжатые фотографии с разрешением как можно выше от камеры. Я попробовал takePicture rawCallback и postviewCallback, но они не работают.

Прямо сейчас я пытаюсь использовать OpenCV (версия 2.4) с помощью VideoCapture, но я застрял в 960x720 по умолчанию, что плохо для того, что мне нужно; и мой телефон, Samsung Galaxy S3, может предоставить теоретически до 8Mpx (3,264 × 2,448 для изображений и 1,920 × 1080 для видео, согласно Википедии). VideoCapture.set(Highgui.CV_CAP_PROP_FRAME_WIDTH/HEIGHT, некоторое число) заставляет камеру вернуть черное изображение, насколько я нашел.

Есть ли способ получить более высокое разрешение либо через OpenCV, либо с помощью API Android без сжатия?

Мне очень жаль, если это было задано раньше; Я искал дни и ничего не нашел.

Спасибо за ваше время!

EDIT: Хотя это не совсем то, что я просил, я обнаружил, что есть способ сделать что-то очень похожее: если вы установите OnPreviewCallback для камеры, используя setPreviewCallback, вы получите необработанные данные изображения с камеры (по крайней мере, в S3, с которым я работаю). Я оставляю его здесь, если кто-то найдет его полезным в будущем.

EDIT: частичное решение объясняется в ответе ниже. Подводя итог,

vc.set(Highgui.CV_CAP_PROP_FRAME_WIDTH, desiredFrameWidth);
vc.set(Highgui.CV_CAP_PROP_FRAME_HEIGHT, desiredFrameHeight);

работает при некоторых условиях; более подробно см. ниже.

Ответ 1

Вы должны получить поддерживаемые предварительные просмотры камеры, вызвав getSupportedPreviewSizes.

После этого вы можете установить любое разрешение с помощью метода setPreviewSize. И не забудьте в конце setParameters. Фактически многие примеры OpenCV Android содержат эту информацию (посмотрите на sample3).

Ответ 2

Если кто-нибудь когда-нибудь найдет это полезным, я нашел (частичное) решение: если ваша переменная VideoCapture называется vc, это должно работать:

vc.set(Highgui.CV_CAP_PROP_FRAME_WIDTH, desiredFrameWidth);
vc.set(Highgui.CV_CAP_PROP_FRAME_HEIGHT, desiredFrameHeight);

Помните, что комбинация ширины и высоты должна быть одним из поддерживаемых форматов изображений для вашей камеры, иначе она просто получит черное изображение. Вы можете получить их через Camera.Parameters.getSupportedPictureSizes().

Однако установка высокого разрешения превышает пропускную способность конвертера YUV, поэтому я все еще борюсь с этим. Я собираюсь сделать для этого новый отдельный вопрос, чтобы все было яснее: новый поток

Ответ 3

setPreviewSize не устанавливает разрешение изображения. setPictureSize делает.