2017-06-09 45 views
1

我一直在我的项目中使用OpenNI + PrimeSense + NiTE和OpenCV来根据它们的距离来分割对象。不过,我打算将它部署在NVIDIA Jetson TX1板上,并且无法通过OpenCV编译OpenNI + PrimeSense + NiTE。 我结束了libfreenect。但是libfreenect提供的深度图非常非常错误。我会分享一些例子。Libfreenect错误的深度图

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

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

我基于默认的C++封装在OpenKinect网站我libfreenect代码。

有人可以帮我吗?非常感谢。

回答

1

那么,对于那些谁是libfreenect在ARM或AARCH64架构(主要是杰特森TX1),因为OpenNI和SensorKinect是有问题的建设工作,我对OpenNI和SensorKinect源码进行了一些调整,以便与Aarch64一起运行,并避免使用libfreenect。

链接:OpenNI for TX1SensorKinect for TX1

0

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

你可以尝试把libfreenect数据为CV ::垫和规模是:

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

您还可以检出本文以及上building OpenNI2上特森TK1。 一旦你有OpenNI的设置和工作,你应该能够从WITH_OPENNIcmake源编译OpenCV。之后,你应该能够直接在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; 



    } 
}