Android Camera2: CONTROL_AE_REGIONS не работает на устройствах Samsung

Используя Android Camera2, я хочу использовать область, чтобы игнорировать верхние 25% изображения при вычислении экспозиции. Я использую это:

// Compute the metering rectangle to ignore the top 25% of the picture:
Rect newRect = new Rect(mActiveArraySize.left, (int) (mActiveArraySize.height() * 0.25), mActiveArraySize.right, mActiveArraySize.bottom);
MeteringRectangle meteringRectangle = new MeteringRectangle(newRect, 1);
MeteringRectangle[] meteringRectangleArr = { meteringRectangle };

// Set the metering rectangle:
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_REGIONS, meteringRectangleArr);

// Set the request:
try { mCaptureSession.setRepeatingRequest(mPreviewRequestBuilder.build(), null, mBackgroundHandler); }
catch (CameraAccessException e) { e.printStackTrace(); }

И это работает на моем Nexus 5X. Но на Samsung Galaxy Note 5 (и, наверное, на всех устройствах Samsung) это не работает, моя область игнорируется.

Я видел этот вопрос: Android Camera2 API - установка AE-регионов не работает, и оператор сказал, что ему удалось заставить его работать с помощью Samsung SDK. Я действительно предпочел бы избежать этого.

Кому-то удалось заставить регионы AE работать с устройствами Samsung?


person Tim Autin    schedule 02.06.2017    source источник
comment
У меня точно такая же проблема. Пробовал на 3-х телефонах, включая LG Nexus 5, но безрезультатно :( Кстати, вы устанавливали какие-либо параметры CONTROL_AE_PRECAPTURE_TRIGGER, CONTROL_AE_MODE, CONTROL_AE_LOCK?   -  person Mikhail    schedule 28.08.2017


Ответы (1)


Недавно у меня была такая же проблема, и, наконец, я нашел решение, которое мне помогло.

Все, что мне нужно было сделать, это отступить на 1 пиксель от краев активного прямоугольника сенсора. В вашем примере вместо этого прямоугольника:

Rect newRect = new Rect(mActiveArraySize.left,
                        (int) (mActiveArraySize.height() * 0.25),
                        mActiveArraySize.right,
                        mActiveArraySize.bottom);

Я бы использовал это:

Rect newRect = new Rect(mActiveArraySize.left + 1,
                        (int)(mActiveArraySize.height() * 0.25),
                        mActiveArraySize.right + 1,
                        mActiveArraySize.bottom - 2);

Я вычел 2 из нижней части, потому что самый нижний пиксель активного массива равен mActiveArraySize.height() - 1, и мне нужно вычесть еще один пиксель.

Похоже, что многие поставщики плохо реализовали эту часть документации

Если область замера находится за пределами используемого android.scaler.cropRegion, возвращенного в метаданных результата захвата, устройство камеры будет игнорировать участки за пределами области обрезки и выводить только прямоугольник пересечения в качестве области замера в метаданных результата. Если область находится полностью за пределами области обрезки, она будет проигнорирована и не будет указана в метаданных результата.

person Mikhail    schedule 04.09.2017
comment
Большое спасибо, я попробую и приму ваш ответ, если он сработает для меня! Возможно, вы сэкономили мне недели работы по внедрению Samsung SDK... - person Tim Autin; 12.09.2017
comment
Итак, у меня наконец-то появилось время попробовать ваше решение, но безуспешно. На Samsung Galaxy Note 5 размер активного массива составляет [0,0][5328,3000]. Если я использую область замера [1,1000][5326,1500], это не работает (это не имеет никакого эффекта, экспозиция все равно рассчитывается для всего экрана). Не могли бы вы дать мне размер активного массива и область измерения, которые вам удалось заставить работать на устройстве Samsung? - person Tim Autin; 07.06.2018
comment
@TimAutin На Samsung A7 прямоугольник датчика, который я получаю из характеристик камеры, имеет вид: Rect (0, 0 - 4624, 3466). Затем я обрезаю его, чтобы выровнять соотношение сторон с видимой областью предварительного просмотра, что дает: Rect (0, 508 - 4624, 2957). Затем я использую область замера экспозиции Rect(1, 1120 - 4623, 2549) (мне нужно вырезать части изображения сверху и снизу из-за специфики моего приложения). Кажется, это работает для меня. - person Mikhail; 22.06.2018