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

时间:2018-02-16 22:42:44

标签: opencv openni

我目前正在使用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库解决了问题。谢谢Dmitrii!

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

这里是深度图的截图(倒置为白色,非常弱的共振):

enter image description here

1 个答案:

答案 0 :(得分:0)

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