2016-07-13 16 views
0

Ich verwende eine PMD Kamera Tiefenbild im folgenden Format zu erfassenConverting Tiefe Bild in offene cv Mat Format

struct DepthData 
{ 
    int  version; 
    std::chrono::microseconds timeStamp;  
    uint16_t     width;   
    uint16_t     height;   
    Vector of uint_16   exposureTimes; 
    Vector of DepthPoint  points;   //!< array of points 
}; 

Tiefe Punktstruktur sieht wie folgt aus

struct DepthPoint 
{ 
    float x;     //!< X coordinate [meters] 
    float y;     //!< Y coordinate [meters] 
    float z;     //!< Z coordinate [meters] 
    float noise;    //!< noise value [meters] 
    uint16_t grayValue;  //!< 16-bit gray value 
    uint8_t depthConfidence; //!< value 0 = bad, 255 = good 
}; 

Und ich versuche zu wandeln Sie es in opencv mat Datenstruktur um. Unten ist der Code. Aber es wirft eine Ausnahme. Bitte helfen

const int imageSize = w * h; 

Mat out = cv::Mat(h, w, CV_16UC3, Scalar(0, 0, 0)); 

const Scalar S; 


for (int h = 0; h < out.rows; h++) 
{ 
    //printf("%" PRIu64 "\n", point.at(h).grayValue); 
    for (int w = 0; w < out.cols; w++) 
    { 
    //printf("%" PRIu64 "\n", point.at(h).grayValue); 
    out.at<cv::Vec3f>(h,w)[0] = point[w].x; 
    out.at<cv::Vec3f>(h, w)[1] = point[w].y; 
    out.at<cv::Vec3f>(h, w)[2] = point[w].z; 

    } 
} 

imwrite("E:/softwares/1.8.0.71/bin/depthImage1.png", out); 
+0

Ich bin ein wenig verwirrt. Versuchen Sie ein Tiefenbild zu erstellen? Dann brauchst du wahrscheinlich keine 3 Kanäle. Sie müssten die Tiefe selbst aus 'x, y, z'-Koordinaten berechnen und sie auf ein Pixel in einem Einkanalbild setzen. – niosus

+0

Ich versuche, die Tiefendaten im PNG-Format zu speichern, und ich erfasse die Daten mit royale API für PMD-Kamera. Gibt es einen anderen Weg, es zu tun? – MThomas

+0

Ich denke, das ist nicht auf die Frage selbst bezogen, aber es scheint, dass Sie einen Fehler in der Schleife haben. Sie scheinen über Punkt zu iterieren. Ich nehme an, dass es sich um ein Array von 'DepthPoint'-Objekten handelt. Sie durchlaufen nur Werte mit dem Index von '0' bis 'out.cols'. – niosus

Antwort

0

Sie scheinen ein paar Dinge falsch zu machen.

Sie ein Bild vom Typ CV_16UC3 schaffen, die ein 3-Kanal-16-Bit-unsigned char Bild ist. Dann versuchen Sie in out.at<cv::Vec3f>(h,w)[0] einen Teil davon als Vektor von 3 Schwimmern zu lesen. Sie sollten Ihr Bild wahrscheinlich stattdessen als Float-Bild erstellen.

Für weitere Details geben Sie bitte die Ausnahme an. Es wird einfacher zu helfen sein.

UPD: Wenn Sie nur ein Tiefenbild möchten, erstellen Sie ein Bild wie folgt aus:

Mat out = cv::Mat::zeros(h, w, CV_16UC1); 

Dann in jedem Pixel:

out.at<uint16_t>(h, w) = depth_point.grayValue; 
+0

Ich möchte mein Bild als 16-Bit-PNG-Bild speichern. Wie kann ich auf die Grauwerte in der Struktur DepthPoint zugreifen, anstatt die Float-Werte zu verwenden? – MThomas

+0

siehe aktualisierte Antwort – niosus

+0

Ich habe es versucht. Aber ich bekomme die folgende Ausnahme. OpenCV-Fehler: Assertion fehlgeschlagen (total() == 0 || data! = NULL) in cv :: Mat :: Mat, Datei E: \ software \ opencv-3.1.0 \ opencv-3.1.0 \ modules \ core \ include \ opencv2/core/mat.inl.hpp, Zeile 410 – MThomas

Verwandte Themen