فرق مستوى التكبير بين Camera1 و Camera2

1

في تطبيقنا ، ندعم كلاً من واجهات برمجة التطبيقات والكاميرا والكاميرا 2 لالتقاط الصور. ما لاحظته هو أننا نحصل على أعماق تكبير مختلفة عبر كل من واجهات برمجة التطبيقات.

باستخدام Camera1 API ، يكون تعيين مستوى التكبير أمرًا بسيطًا:

Camera.Paramenters params = mCamera.getParameters();
params.setZoom(zoomLevel);
mCamera.setParameters(params);

باستخدام Camera2 API ، يتم تعيين مستوى التكبير / التصغير كما يلي (الكود المستخدم لتطبيق نموذج Camera2 القياسي):

final int zoomScale = 200;
captureBuilder.set(CaptureRequest.SCALER_CROP_REGION, new
     Rect(zoomScale * mZoomLevel, zoomScale * mZoomLevel, mStartBounds.right
     - (zoomScale * mZoomLevel), mStartBounds.bottom - (zoomScale * mZoomLevel)));

يحتوي جهاز Android الذي أستخدمه على قيمة تكبير قصوى تبلغ 4. في مستوى التكبير / التصغير 4 ، يبدو أن الكاميرا 1 تقوم بالتكبير أكثر بكثير من الكاميرا 2 (بنسبة 10٪ على الأقل).

أتساءل عما إذا كنت قد فقدت شيئًا في حسابي أم أنها الطريقة التي تم بها تصميم Camera2 API. مع تحياتي.

1 إجابة

0

لست متأكدًا من كيفية اختيار القيمة 200 لـ zoomScale. تقع منطقة الاقتصاص للكاميرا 2 في إحداثيات الصفيف النشط للمستشعر ، لذلك إذا كنت تريد تكبير / تصغير 2x ، فستحتاج إلى تعيين المستطيل على نصف عرض الصفيف النشط وارتفاعه.

كود العينة الخام:

CameraCharacteristics c = cameraManager.getCameraCharacteristics(cameraId);
Rect activeArray = c.get(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE);
int cropWidth = activeArray.width() / mZoomLevel;
int cropHeight = activeArray.height() / mZoomLevel; 
int cropLeft = (activeArray.width() - cropWidth) / 2;
int cropTop = (activeArray.height() - cropHeight) / 2;
Rect cropRegion = new Rect(cropLeft, cropTop, cropLeft + cropWidth, cropTop + cropHeight)
captureBuilder.set(CaptureRequest.SCALER_CROP_REGION, cropRegion);
:مؤلف
فوق
قائمة طعام