如何在 OpenCV 中使用 Orbbec Astra 深度传感器?

Posted

技术标签:

【中文标题】如何在 OpenCV 中使用 Orbbec Astra 深度传感器?【英文标题】:How to use Orbbec Astra depth sensor with OpenCV? 【发布时间】:2018-02-16 22:42:43 【问题描述】:

我目前正在使用Orbbec Astra Mini 深度传感器。我下载并安装了Astra Driver and OpenNI2 包。一旦我将深度传感器连接到 USB 端口,它就会显示在我的 Windows 10 的设备管理器中。到目前为止一切都很好。

我的目标是使用 OpenCV 阅读 RGB imagesdepth map 并使用 imshow 显示它们。

以下代码在 Visual Studio 2015 中编译良好,但出现此错误:

OpenCV Error: Assertion failed (size.width>0 && size.height>0) in cv::imshow, file C:\build\master_winpack-build-win64-vc14\opencv\modules\highgui\src\window.cpp

...所以我猜 OpenCV 无法打开设备,因此我的 cv::Mat 一直是空的。

我在某处读到我需要使用 OpenNI 标志编译 OpenCV - 这是真的吗?如果是这样,任何有用的链接可能会帮助我取得一些进展?有什么我可能错过的想法吗?

#include<iostream>
#include<algorithm>
#include<fstream>
#include<System.h>
#include<time.h>
#include<opencv2/core/core.hpp>

using namespace std;

int main(int argc, char **argv) 

    cv::VideoCapture cap;
    cap.open(CV_CAP_OPENNI);
    cap.set(CV_CAP_OPENNI_IMAGE_GENERATOR_OUTPUT_MODE, CV_CAP_OPENNI_VGA_30HZ);
    cap.set(CV_CAP_OPENNI_DEPTH_GENERATOR_REGISTRATION, 1);

    cv::Mat im, dm;     // rgb image, depth map

    while (true)
    

        if (cap.grab()) 
            cap.retrieve(im, CV_CAP_OPENNI_BGR_IMAGE);
            cap.retrieve(dm, CV_CAP_OPENNI_DEPTH_MAP);
         else 
            cout << "ERROR: Could not grab image data." << endl;
        

        if (!im.data) 
            cout << "ERROR: RGB not retrieved." << endl;
        

        if (!dm.data) 
            cout << "ERROR: Depth map not retrieved." << endl;
        

        cv::imshow("Image", im);
        cv::imshow("Depth", dm);

        if (cv::waitKey(1) >= 0)
            break;
    

    cap.release();

    return 0;

更新 19.02.18:

如here 所述,通过使用 OpenNI 标志编译 OpenCV 库解决了问题。谢谢德米特里!

但是,深度图像仍然很弱。任何想法/如何调整参数?虽然,在运行 Orbbec Astra SDK 的示例应用程序时,深度图像非常稳定(使用 OpenGL)。所以我猜问题出在 OpenCV 的某个地方?

这是深度图的截图(倒转为白色,共振相当弱):

【问题讨论】:

那么你为什么不编译支持openni的opencv呢?我可以在CMakeLists.txt 中看到WITH_OPENNI 标志。 OpenCV 文档对于 windows 有相当多的installation guide 谢谢!将完成教程并报告。 @Dmitrii Z.:感谢您的帮助!它现在与 OpenCV+OpenNI+AstraSDK+ORBSLAM2 一起使用。任何想法如何在 OpenCV 中调整深度相机属性? 【参考方案1】:

我写了一个comprehensive guide 如何编译ORB SLAM 2(这是我的初步目标)和OpenCV,包括OpenNI2,以便使用我的Orbbec Astra camera 作为深度传感器。希望其他绊倒这个线程的人可以使用它。

【讨论】:

综合指南链接失效。【参考方案2】:

你问:

但是,深度图像仍然很弱。任何想法/如何调整参数?虽然,在运行 Orbbec Astra SDK 的示例应用程序时,深度图像非常稳定(使用 OpenGL)。所以我猜问题出在 OpenCV 的某个地方?

尝试对深度图像实施假彩色映射。不同深度的像素值相差很大,因此直接观察不易辨别。

 // Holds the colormap version of the image:
 Mat img_color;
 // Apply the colormap:
 applyColorMap(img_in, img_color, COLORMAP_JET);
 // Show the result:
 imshow("colorMap", img_color);

https://docs.opencv.org/3.4.1/d3/d50/group__imgproc__colormap.html

【讨论】:

以上是关于如何在 OpenCV 中使用 Orbbec Astra 深度传感器?的主要内容,如果未能解决你的问题,请参考以下文章

如何在带有 Boost Spirit 的 AST 中使用只有一个属性的类?

如何在AST中添加注释模板

如何从 C 级代码访问 Ruby AST?

我如何让铿锵声转储没有颜色的 AST?

如何在 AST 解析器中将类型解析为原语

如何通过备注从 Markdown 中获取 AST 树