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);
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
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
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