如何从USB 3.0立体相机计算深度信息?

时间:2015-03-19 01:14:45

标签: python opencv openni stereo-3d

我对使用立体相机计算视频/图像深度感兴趣。该相机是Leopard Imaging https://www.leopardimaging.com/LI-USB30-V024STEREO.html的USB 3.0立体相机。我正在使用MAC OS X顺便说一句。

他的客户支持告诉我,它是" UVC"相机。当连接到苹果电脑时,它会产生绿色图像。

我的最终目标是使用OpenCV从两个镜头中抓取左右框架,以便我可以计算深度。我熟悉OpenCV,但不熟悉使用立体相机。任何帮助将非常感激。到目前为止,我一直在Python 3中这样做:

import numpy as np
import cv2
import sys
from matplotlib import pyplot as plt

import pdb; pdb.set_trace()
print("Camera 1 capture", file=sys.stderr)
cap = cv2.VideoCapture(1)

print("Entering while", file=sys.stderr)
while(True):
    _ = cap.grab()
    retVal, frame = cap.retrieve()

    #gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    cv2.imshow('frame', frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

这样可行,但它只给我一张没有深度的绿色图片/图像。关于如何从相机获取左右帧的任何建议?

3 个答案:

答案 0 :(得分:5)

豹子成像人员给我一个线索,但我无法取得进展,因为我猜我的核心文件中有一些丢失的文件。但是,我认为这可能对某人有所帮助。所以我发布它作为答案。 该邮件是由我通过邮件联系的一位豹子成像人员发送的。就像这样......

我们有一位客户在一年前成功地在Linux OS上分离了这两个视频。我试图联系他,看看他是否可以与我们分享源代码。不幸的是,他已经离开了这家前公司,但他仍然发现了一些笔记(下图)。希望它有所帮助。

相机将来自两个传感器的图像组合成一个16位像素数据(来自一个相机的高8位,来自另一个相机的低8位)。 要在linux opencv中解决这个问题,应该通过opencv:at

跳过颜色转换
modules/videoio/src/cap_v4l.cpp static IplImage* icvRetrieveFrameCAM_V4L( CvCaptureCAM_V4L* capture, int)

case V4L2_PIX_FMT_YUYV:
#if 1
    /*
    skip color convert. Just copy image buffer to frame.imageData
    */
    memcpy(capture->frame.imageData, capture->buffers[capture->bufferIndex].start, capture->buffers[capture->bufferIndex].length);
#else
    yuyv_to_rgb24(capture->form.fmt.pix.width, capture->form.fmt.pix.height,(unsigned char*) capture->buffers[capture->bufferIndex].start),
            (unsigned char*)capture->frame.imageData);
#endif

希望这有帮助。

免责声明:我继续使用libuvc中给出的C ++版本(我的项目使用C ++),使用提供的例程分别获取左右帧。

答案 1 :(得分:2)

我正在追逐相同的问题,但使用C / C ++。我已联系Leopard并正在等待答案。我的理解是两个灰度相机交错成一个图像(我认为OpenCV将其视为彩色图像,因此奇怪的颜色和失焦。)您需要将字节分成两个独立的帧。我正在尝试,试图弄清楚字节位置,但还没有走得太远。如果你弄明白了,请告诉我!

他们在Windows上有一个C#示例: https://www.dropbox.com/sh/49cpwx0s70fuich/2e0_mFTJY_

不幸的是,它正在使用他们的库(不是源代码)来完成繁重的工作,所以我无法弄清楚他们在做什么。

答案 2 :(得分:2)

我遇到了和你一样的问题,终于找到了解决方案。但我不知道OpenCV是否可以直接处理它,特别是在Python中。

正如jordanthompson所说,两张图像交织成一张。您收到的图像是YUYV(Y是光强度,UV是包含颜色信息)。每个像素编码为16位,8表示Y,8表示U或V,具体取决于您正在查看的像素。

这里,Y位来自左图像,UV位来自右图像。但是当OpenCV接收到这个图像时,它会将它转换为RGB然后肯定会混合两个图像..我在Python中找不到一种方法告诉OpenCV获取图像而不转换它...因此我们需要先阅读图像OpenCV的。在添加两个小函数来执行正确的转换后,我设法使用libuvc(https://github.com/ktossell/libuvc)。如果您可以在C ++而不是Python中使用openCV,我想你可以使用这个库。如果你真的必须坚持使用Python,那么我没有完整的解决方案,但至少现在你知道要寻找什么:尝试直接在YUYV中读取图像然后将这些位分成左右图像(您将获得两个灰度图像)。

祝你好运!