1

我一直在我的项目中使用 OpenNI+PrimeSense+NiTE 和 OpenCV 来根据对象的距离分割对象。但是,我打算将它部署在 NVIDIA Jetson TX1 板上,但它无法使用 OpenCV 编译 OpenNI+PrimeSense+NiTE。我最终得到了 libfreenect。然而,libfreenect 提供的深度图是非常非常错误的。我将分享一些例子。

这是 OpenNI 的工作深度图: OpenNI Depth Map

libfreenect 错误的深度图在这里:Libfreenect Depth Map

我的 libfreenect 代码基于 OpenKinect 网站上的默认 C++ 包装器。

有人可以在这里帮助我吗?非常感谢。

4

2 回答 2

1

好吧,对于那些在 ARM 或 AARCH64 架构(主要是 Jetson TX1)上使用 libfreenect 的人来说,因为 OpenNI 和 SensorKinect 的构建存在问题,我对 OpenNI 和 SensorKinect 源代码进行了一些调整,以便在 Aarch64 上运行并避免使用 libfreenect。

链接:用于 TX1的 OpenNI和用于 TX1 的 SensorKinect

于 2017-06-13T21:36:38.513 回答
0

它看起来像深度数据的不同映射。

您可以尝试将 libfreenect 数据放入 cv::Mat 并对其进行缩放:

const float scaleFactor = 0.05f;
depth.convertTo(depthMat8UC1, CV_8UC1, scaleFactor);
imshow("depth gray",depthMat8UC1);

您还可以查看这篇文章以及在 Jetson TK1 上构建 OpenNI2。一旦你安装了 OpenNI 并开始工作,你应该能够从源代码中编译 OpenCV 并WITH_OPENNI使用cmake. 之后,您应该能够直接在 OpenCV 中获取深度数据:

#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"

#include <iostream>

using namespace cv;
using namespace std;

const float scaleFactor = 0.05f;

int main(){
cout << "opening device(s)" << endl;

VideoCapture sensor;
sensor.open(CV_CAP_OPENNI);

if( !sensor.isOpened() ){
    cout << "Can not open capture object 1." << endl;
    return -1;
}

for(;;){
    Mat depth,depthScaled;

    if( !sensor.grab() ){
        cout << "Sensor1 can not grab images." << endl;
        return -1;
    }else if( sensor.retrieve( depth, CV_CAP_OPENNI_DEPTH_MAP ) ) {
        depth.convertTo(depthScaled, CV_8UC1, scaleFactor);
        imshow("depth",depth);
        imshow("depth scaled",depthScaled);
    }

    if( waitKey( 30 ) == 27 )   break;



   }
}
于 2017-06-10T09:21:23.837 回答