2017-06-09 43 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; 



    } 
}