2016-08-09 118 views
0

Ich habe float x, float y, Float z Werte eines Bildes. Ich möchte ein 16-Bit-Png-Tiefenbild konstruieren, indem ich die Z-Werte kopiere. Das Bild, das ich dadurch erhalte, hat einige ungültige Punkte. Unten ist mein Code.Mat Image Erstellung von Rohpufferdaten

uint16_t* depthValues = new uint16_t[size]; 
auto sampleVector(DepthPoints); 
for (unsigned int i = 0; i < sampleVector.size(); i++) 
    { 
     depthValues[i] = (sampleVector.at(i).z) * 65536; 
    } 
    Mat newDepthImage = cv::Mat(var.height, var.width, CV_16UC1,depthValues); 
imwrite(Location, CImage); 

Kann mir jemand sagen, ob ich die float-Werte in ein unsigned char-Array kopieren kann, um das Bild zu erstellen? Ist mein Bild deshalb ungültig?

+0

Was "Ergebnis hat einige ungültige Punkte" genau bedeutet? Ist der Bereich der z-Werte "[0 - 1]"? Wenn z Werte> 1 hat, ist alles über 1 65535. – DimChtz

+0

einige Bereiche des Bildes sind dunkel. Ich war mir nicht sicher, ob die Float-Daten nach 'uint16_t * 'kopiert werden können. Können wir so ein Tiefenbild schaffen? – MThomas

+0

Was ist der Bereich von 'z' Werten? Vielleicht brauchst du nur 'depthValues ​​[i] = static_cast (sampleVector.at (i) .z);' BTW, x, y, z bezieht sich auf R, G, B? – DimChtz

Antwort

0
auto sampleVector(DepthPoints); 
const int size = sampleVector.size(); 
float* depthValues = new float[size]; 
for (unsigned int i = 0; i < sampleVector.size(); i++) 
    { 
     depthValues[i] = (sampleVector.at(i).z); 
    } 
Mat depthImageOne, depthImageTwo; 
Mat depthImageNew = cv::Mat(var.height, var.width, CV_32FC1,depthValues); 
normalize(newDepthImageNew, depthImageOne, 1, 0, NORM_MINMAX, CV_32FC1); 
depthImageOne.convertTo(depthImageTwo, CV_16UC1, 65536.0,0.0); 
imwrite("path", depthImageTwo); 

Die Normalisierung kann zum Verlust von Tiefeninformationen führen. Ich habe die Normalisierung zur Visualisierung der Bilder verwendet. Um die Tiefeninformationen zu erhalten, habe ich den folgenden Code verwendet.

Mat depthImageNew = cv::Mat(var.height, var.width, CV_32FC1,depthValues); 
depthImageOne.convertTo(depthImageTwo, CV_16UC1, 1000.0,0.0);