【问题标题】:How to calculate Depth Information from USB 3.0 Stereo Camera?如何从 USB 3.0 立体相机计算深度信息?
【发布时间】:2015-05-22 00:51:16
【问题描述】:

我有兴趣使用立体相机来计算视频/图像的深度。该相机是来自 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()

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

【问题讨论】:

  • 你得到的可能只是红外图像。要检索立体帧,您需要 openni 的帮助,默认情况下它不是内置的。(检查:cv2.getBuildInformation()),因此您需要 openni sdk,并从 src 编译 opencv。

标签: python opencv openni stereo-3d


【解决方案1】:

豹成像人员给我发了一条线索,但我无法取得进展,因为我猜我的核心文件中缺少一些文件。但是,我认为它可能会帮助某人。因此,我将其发布为答案。 该消息是由我通过邮件联系的豹成像人员之一发送的。是这样的.....

我们有一位客户在一年前在 Linux 操作系统上成功分离了这两个视频。我试图联系他,看看他是否可以与我们分享源代码。不幸的是,他已经离开了以前的公司,但他还是找到了一些笔记(下)。希望对您有所帮助。

相机将来自两个传感器的图像组合成一个 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++)使用提供的例程分别获取左右帧。

【讨论】:

    【解决方案2】:

    我正在寻找同样的问题,但使用的是 C/C++。我已联系 Leopard,正在等待答复。我的理解是,两个灰度相机交错成一个图像(我认为 OpenCV 将其视为彩色图像,因此颜色很奇怪并且失焦。)您需要将字节分成两个单独的帧。我正在试验,试图找出字节位置,但还没有走得太远。如果你解决了这个问题,请告诉我!

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      祝你好运!

      【讨论】:

      • 太棒了。好久没看这个帖子了。我得出了同样的结论,但为了准备我的博士考试而停止了研究。您能否参考一下您使用 libuvc 使用/编写的功能?也许在 gist/github 上?
      • 当然!这是我向 libuvc 提出的拉取请求,其中包含我添加的功能 github.com/ktossell/libuvc/pull/27
      • 不错。我将在今天晚些时候查看拉取请求。如果一切看起来都不错,我会继续接受你的回答!
      • 我一直在尝试你的新 libuvc 函数。我遇到了死胡同,我只想确保我正确实施。你认为你可以看看我写的这个使用你的函数的小程序吗?我认为你的指点可以帮助我。 github.com/nmante/Stereo_Camera_Examples/blob/master/libuvc_cpp/…
      • 我正在使用uvc打开设备。然后我写了一个 uvc 回调,它应该以 yuyv 格式抓取帧。然后我调用您在该帧上编写的函数(一个用于 y 像素,一个用于 uv 像素)并将它们转储到两个灰色帧中。然后我只是输出它们。但是,当我输出 (imshow) 时,我只会得到两个白色/空白图像。
      猜你喜欢
      • 2018-03-15
      • 2015-02-27
      • 2021-03-29
      • 2016-05-13
      • 1970-01-01
      • 2018-10-01
      • 2013-11-26
      • 2018-06-27
      • 2014-03-13
      相关资源
      最近更新 更多