2017-06-09 3 views
1

J'ai utilisé OpenNI + PrimeSense + NiTE avec OpenCV sur mon projet pour segmenter des objets en fonction de leurs distances. Cependant, je voulais le déployer dans une carte NVIDIA Jetson TX1 et il n'a pas réussi à compiler OpenNI + PrimeSense + NiTE avec OpenCV dessus. J'ai terminé avec libfreenect. Cependant, la carte de profondeur fournie par libfreenect est très, très fausse. Je vais partager quelques exemples.Libfreenect carte de profondeur erronée

Voici la carte de profondeur de travail de OpenNI: OpenNI Depth Map

La libfreenect mauvaise carte de profondeur est ici: Libfreenect Depth Map

I sur la base de mon code libfreenect sur la valeur par défaut C++ wrapper au site OpenKinect.

Quelqu'un peut-il m'aider ici? Merci beaucoup.

Répondre

1

Eh bien, pour ceux qui travaillent avec libfreenect sur ARM ou architectures AARCH64 (principalement Jetson TX1) parce OpenNI et SensorKinect sont problématiques à construire, J'ai fait quelques ajustements sur les sources OpenNI et SensorKinect pour les exécuter avec Aarch64 et éviter d'avoir à utiliser libfreenect.

Liens: OpenNI for TX1 et SensorKinect for TX1

0

Il ressemble à des mappages différents des données de profondeur.

Vous pouvez essayer de mettre les données libfreenect dans un cv :: Mat et échelle que:

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

Vous pouvez également checkout cet article et building OpenNI2 sur un Jetson TK1. Une fois que vous avez installé et fonctionné OpenNI, vous devriez être capable de compiler OpenCV à partir de la source en activant WITH_OPENNI avec cmake. Après cela, vous devriez être en mesure de saisir les données de profondeur directement 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; 



    } 
}