Riguarda la decompressione dei valori rgb codificati in un file pcl. L'ho fatto con la procedura descritta nella documentazione di pcl, ma i valori rgb decompressi che ottengo non sono del tutto corretti. Quando li diagramma con R, la rappresentazione data non corrisponde ai colori nel contesto reale (sono certo che il problema non è il modo in cui è stato tracciato con R).Disimballaggio dei valori RGB in un dataset nuvola di punti
Ad esempio nell'immagine allegata l'area delimitata dovrebbe avere i colori grigio e blu (due sedie e un tavolo).
di file PCL fonte potrebbe essere trovata a: https://docs.google.com/open?id=0Bz5-HVcDiF6SanBZU0JWVmJwWHM e il file con i valori di colore non imballati in: https://docs.google.com/open?id=0Bz5-HVcDiF6SV2pYQ0xUbTAwVmM. Inoltre segue è il codice utilizzato per decomprimere i valori di colore in un c plus plus impostazione:
uint32_t rgbD = *reinterpret_cast<int*>(&kinectValue);
uint16_t rD = (rgbD >> 16) & 0x0000ff;
uint16_t gD = (rgbD >> 8) & 0x0000ff;
uint16_t bD = (rgbD) & 0x0000ff;
Vorrei davvero apprezzare se potesse farmi sapere dove ho sbagliato.
Aggiornamento:
seguito riporta il codice R frammento di che ho usato nel tracciare i valori in 3D:
library(rgl)
pcd <- read.table(file.choose(),sep="")
names(pcd) <- c("x","y","z","r","g","b")
plot3d(pcd$x,pcd$y,pcd$z,col=rgb(pcd$r,pcd$g,pcd$b,maxColorValue=255))
Aggiornamento:
seguito è il codice che ho usato per leggere i dati, in C++ :
/*
Reads in a file from Kinect with unpacked color values, filter the color value component and
sends it to be unpacked
*/
int fileRead(){
string line;
int lineNum = 0;
ifstream myfile ("res/OnePerson4.pcd");
if (myfile.is_open())
{
while (myfile.good())
{
lineNum++;
getline (myfile,line);
// Exclude the header information in the kinect file from the unpacking process
//if(lineNum > 10 && lineNum <20){//This for loop is activated when testing
if(lineNum > 10){
//Test code to extract the x,y,z values
string xyzvalFromKinectStr = line.substr(0,line.find_last_of(' '));
//cout<<xyzvalFromKinectStr<<"\n";
//Extract the packed rgb value
string valFromKinectStr = line.substr(line.find_last_of(' '));
double kinectVal = ::atof(valFromKinectStr.c_str());
kinectToRgb(kinectVal, xyzvalFromKinectStr);
}
}
myfile.close();
}
else
{
cout << "Unable to open file";
}
return 0;
}
Entrambi i collegamenti scaricano zero byte per me. –
@ MichaelDaum, mi dispiace per quello. Rettificherò presto il problema. Grazie per aver dedicato del tempo a guardare al problema. –
RGB viene in genere rappresentato come RGBA. Questo può essere diverso a seconda della piattaforma, ma dovresti provare (rgbD >> 24), >> 16 e >> 8 per R G e B rispettivamente. Ma poiché probabilmente non è questo il problema ... Stai cercando di ottenere R-G-B in uno spazio tridimensionale spoglio. Credi che il disimballaggio del colore sia errato, ma sei completamente sicuro che non sia il codice del disegno o il codice I/O del file? –