2016-08-09 144 views
0

我有float x,float y,float z值的圖像。我想通過複製z值構造一個16位png深度圖像。我得到的圖像有一些無效點。以下是我的代碼。從原始緩衝區數據創建原始圖像

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

可有人告訴我,如果我能浮點值複製到一個unsigned char數組創建圖像? 這就是爲什麼我的圖像有無效點?

+0

什麼「結果有一些無效點」的確切含義? z值的範圍是「[0 - 1]」嗎?如果z的值大於1,則大於1的所有值都是65535. – DimChtz

+0

圖像的某些區域很暗。我不太確定浮點數據是否可以複製到'uint16_t *'。那是我們如何創建一個深度圖像? – MThomas

+0

'z'值的範圍是多少?也許所有你需要的是'depthValues [i] = static_cast (sampleVector.at(i).z);'BTW,x,y,z是指R,G,B? – DimChtz

回答

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

規範化可能會導致深度信息丟失。我用圖像的可視化規範化。爲了保留深度信息,我使用了下面的代碼。

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