非同步同帧双目摄像头采集图像进行深度检测处理的一点想法

市面常见双目摄像头
    双目视觉算法可以很好运行的前提条件是左右两幅图像是同一时间采集的,即感光芯片曝光的时间段是相同的,目前市面上也有很多同步同帧的双目摄像头,一般价格都挺贵,之前用MYNTEYE 小觅摄像头测试得到的深度图像还凑合。但是事情并没有那么简单,遇到强光环境,普通的摄像头图像会因为光暗对比太大导致部分图像曝光不充分,尤其是在室外的环境,拍摄到的图像有可能会损失掉很多细节。
宽动态摄像头
    所以如果要用在室外光线复杂的环境下,普通的双目摄像头是达不到要求的。对于复杂的光线环境,需要动态范围更宽的摄像头。宽动态摄像头很多很普遍,双目摄像头也不少,但是问题在于,宽动态的同步同帧双目摄像头实在没有。宽动态双目摄像头的研发并不复杂,也是普通双目摄像头的那一套,只是换个感光芯片之类的。然而到目前为止,并没有出现宽动态范围的同步同帧的双目摄像头。
    因为正在做的项目是用双目摄像头在室外采集图像获取深度数据,而且工作环境光线复杂,因此必须使用宽动态摄像头。由于目前市面上买不到同步同帧的宽动态双目摄像头,所以也只能找两个宽动态摄像头拼一个双目了。

两个独立摄像头的同步问题
    当前用的是两路相同的宽动态摄像头,帧率 25 帧每秒 ,输出图像 640*480 ,usb2.0口。说是25帧每秒,其实都知道没那么绝对,有可能是24.95,有可能是25.5,这完全看时钟源和感光芯片的心情。在没有同步机制的情况下,两个摄像头在同一个十秒时间里采集的图像可能会相差好几帧。相差几帧的后果很可怕,说明左右图像的采集间隔是不固定的,这给之后的图像处理带来很大难度。

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以通过使用Camera API或Camera2 API来实现同步两个摄像头采集到的视频帧。首先,需要打开两个摄像头并设置它们的参数,例如分辨率、帧率等。然后,可以使用Camera API或Camera2 API中的CaptureRequest来同时捕获两个摄像头的视频帧,并将它们合并成一个视频流。 具体实现步骤如下: 1. 打开两个摄像头并设置它们的参数: ```java CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); CameraCharacteristics cameraCharacteristics1 = cameraManager.getCameraCharacteristics("0"); CameraCharacteristics cameraCharacteristics2 = cameraManager.getCameraCharacteristics("1"); Size[] sizes1 = cameraCharacteristics1.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP).getOutputSizes(ImageFormat.YUV_420_888); Size[] sizes2 = cameraCharacteristics2.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP).getOutputSizes(ImageFormat.YUV_420_888); int width = sizes1[0].getWidth(); int height = sizes1[0].getHeight(); camera1 = Camera.open(0); Camera.Parameters parameters1 = camera1.getParameters(); parameters1.setPreviewSize(width, height); camera1.setParameters(parameters1); camera2 = Camera.open(1); Camera.Parameters parameters2 = camera2.getParameters(); parameters2.setPreviewSize(width, height); camera2.setParameters(parameters2); ``` 2. 创建CameraCaptureSession并设置它的输出Surface: ```java SurfaceTexture surfaceTexture = new SurfaceTexture(0); surfaceTexture.setDefaultBufferSize(width, height); Surface surface1 = new Surface(surfaceTexture); Surface surface2 = new Surface(surfaceTexture); camera1.setPreviewTexture(surfaceTexture); camera2.setPreviewTexture(surfaceTexture); camera1.setPreviewCallbackWithBuffer(new Camera.PreviewCallback() { @Override public void onPreviewFrame(byte[] data, Camera camera) { // 处理camera1的视频帧 } }); camera2.setPreviewCallbackWithBuffer(new Camera.PreviewCallback() { @Override public void onPreviewFrame(byte[] data, Camera camera) { // 处理camera2的视频帧 } }); camera1.addCallbackBuffer(new byte[width * height * 3 / 2]); camera2.addCallbackBuffer(new byte[width * height * 3 / 2]); camera1.startPreview(); camera2.startPreview(); CameraCaptureSession.StateCallback stateCallback = new CameraCaptureSession.StateCallback() { @Override public void onConfigured(@NonNull CameraCaptureSession session) { try { CaptureRequest.Builder builder = camera1.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); builder.addTarget(surface1); CaptureRequest request1 = builder.build(); builder = camera2.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); builder.addTarget(surface2); CaptureRequest request2 = builder.build(); session.setRepeatingRequest(request1, null, null); session.setRepeatingRequest(request2, null, null); } catch (CameraAccessException e) { e.printStackTrace(); } } @Override public void onConfigureFailed(@NonNull CameraCaptureSession session) { session.close(); } }; camera1.createCaptureSession(Arrays.asList(surface1, surface2), stateCallback, null); ``` 以上是一种基于Camera API实现同步采集的方法,Camera2 API的实现方式类似,只是需要使用不同的类和方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值