Я работал над этим уже несколько дней. У меня есть проект на основе OpenCV/JavaCameraView, который я пытаюсь интегрировать с объектом Android android.hardware.camera2.CaptureRequest
, который я использую для управления чувствительностью камеры к свету.Можно ли использовать android.hardware.camera2.CaptureRequest с OpenCV?
Проект работает (я вижу изображение на экране), а проект CaptureRequest
работает (см. Также), но объединение двух технологий в одном проекте оказалось большой проблемой.
Кто-нибудь получил эти две технологии для совместной работы? Моя цель состоит в том, чтобы камера находилась под контролем CaptureRequest (ограниченная SENSOR_SENSITIVITY + SENSOR_EXPOSURE_TIME), но на экране отображалось потоковое изображение, фильтрованное через общую библиотеку OpenCV, которую я написал.
Для управления камерой, я могу использовать что-то вроде этого:
mCameraDevice.createCaptureSession(Arrays.asList(surface, mImageReader.getSurface()),
new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) {
// The camera is already closed
if (null == mCameraDevice) {
return;
}
long exposureTime = 66259688,frameDuration = 1000;
int sensitivity = 1512;
mCaptureSession = cameraCaptureSession;
try {
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE,
CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
setAutoFlash(mPreviewRequestBuilder);
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_OFF);
mPreviewRequestBuilder.set(CaptureRequest.SENSOR_EXPOSURE_TIME, Long.valueOf(exposureTime));
mPreviewRequestBuilder.set(CaptureRequest.SENSOR_SENSITIVITY, Integer.valueOf(sensitivity));
mPreviewRequestBuilder.set(CaptureRequest.SENSOR_FRAME_DURATION, Long.valueOf(frameDuration));
mPreviewRequest = mPreviewRequestBuilder.build();
mCaptureSession.setRepeatingRequest(mPreviewRequest,
mCaptureCallback, mBackgroundHandler);
} catch (CameraAccessException e) {
e.printStackTrace();
}catch (Exception e) {
e.printStackTrace();
}
}
Чтобы отфильтровать поток изображения, можно использовать что-то вроде этого:
public class MyCoolScanner extends AppCompatActivity implements CameraBridgeViewBase.CvCameraViewListener2 {
...
@Override
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
mRgba = inputFrame.rgba();
OpenCVNative.myCoolLibrary(mRgba.getNativeObjAddr(),mGray.getNativeObjAddr());
return mGray;
}
Спасибо заранее.
Я буду в ближайшие дни, но буду проверять ответы на этот вопрос. – Brian