2012-04-11 10 views
5

में आरजीबी मानों को अनपॅक करना यह एक पीएलसी फ़ाइल में एन्कोडेड आरजीबी मानों को अनपॅक करने के बारे में है। मैंने पीएलसी दस्तावेज में वर्णित प्रक्रिया के साथ ऐसा किया, लेकिन मुझे प्राप्त किए गए अनपॅक किए गए आरजीबी मान काफी सही नहीं हैं। जब मैं उन्हें आर के साथ साजिश देता हूं तो प्रस्तुतिकरण वास्तविक सेटिंग में रंगों के अनुरूप नहीं होता है (मुझे एक निश्चित डिग्री है कि समस्या आर के साथ प्लॉट किए जाने के तरीके से नहीं है)।पॉइंट क्लाउड डेटा सेट

उदाहरण के लिए चित्रित छवि में चित्रित क्षेत्र में ग्रे और नीले रंग (दो कुर्सियां ​​और एक टेबल) होना चाहिए। unpacked pcl data plotted with the rgl library in R

स्रोत PCL फ़ाइल में पाया जा सकता है: https://docs.google.com/open?id=0Bz5-HVcDiF6SanBZU0JWVmJwWHM और कम से पैक रंग मूल्यों के साथ फ़ाइल: https://docs.google.com/open?id=0Bz5-HVcDiF6SV2pYQ0xUbTAwVmM

uint32_t rgbD = *reinterpret_cast<int*>(&kinectValue); 

    uint16_t rD = (rgbD >> 16) & 0x0000ff; 
    uint16_t gD = (rgbD >> 8) & 0x0000ff; 
    uint16_t bD = (rgbD)  & 0x0000ff; 

मैं वास्तव में अगर तुम मुझे पता है जहाँ मैं गलत हो गया है दे सकता है की सराहना करेंगे: इसके अलावा निम्नलिखित एक ग में रंग मान खोल प्लस प्लस स्थापित करने के लिए इस्तेमाल किया कोड है।

अद्यतन:

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

अपडेट::

के बाद आर कोड स्निपेट मैं 3 डी में मूल्यों की साजिश रचने में प्रयोग किया जाता है

के बाद, कोड मैं डेटा पढ़ने के लिए प्रयोग किया जाता है 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; 
} 
+1

दोनों लिंक मेरे लिए शून्य बाइट डाउनलोड करते हैं। –

+0

@MichaelDaum, इसके बारे में खेद है। मैं जल्द ही इस मुद्दे को सुधार दूंगा। इस मुद्दे को देखने के लिए समय निकालने के लिए धन्यवाद। –

+1

आरजीबी आमतौर पर आरजीबीए के रूप में प्रतिनिधित्व किया जाता है। यह मंच के आधार पर अलग हो सकता है लेकिन आपको क्रमशः आर जी और बी के लिए प्रयास करना चाहिए (आरजीबीडी >> 24), >> 16, और >> 8। लेकिन चूंकि शायद यह समस्या नहीं है ... आप आर-जी-बी को एक दुर्लभ त्रि-आयामी अंतरिक्ष में प्राप्त करने की कोशिश कर रहे हैं। आप मानते हैं कि यह रंग अनपॅकिंग है जो गलत है, लेकिन क्या आप पूरी तरह से सुनिश्चित हैं कि यह ड्रॉइंग कोड या फ़ाइल I/O कोड नहीं है? –

उत्तर

9

यहां मेरा कामकाजी समाधान है। सबसे पहले मैं निर्देशांक में Nans को फ़िल्टर करने के grep के माध्यम से अपने इनपुट भाग गया:

$ grep -v nan OnePerson4.pcd > OnePerson4.pcd.filtered 

तब मैं सी के माध्यम से डेटा निकाले इस तरह ++ कोड:

#include <stdio.h> 

int main() 
{ 
    if (FILE *f = fopen("OnePerson4.pcd.filtered", "rt")) 
    { 
     for (;;) 
     { 
      float x = 0; 
      float y = 0; 
      float z = 0; 
      float color_float = 0; 
      if (fscanf(f, "%f %f %f %f", &x, &y, &z, &color_float) != 4) 
      { 
       break; 
      } 

      unsigned color = *(unsigned const *)&color_float; 
      unsigned r = color & 0xff; 
      unsigned g = (color >> 8) & 0xff; 
      unsigned b = (color >> 16) & 0xff; 
      printf("%f,%f,%f,%d,%d,%d\n", x, y, z, r, g, b); 
     } 

     fclose(f); 
    } 

    return 0; 
} 

मुझे नहीं पता था जो बाइट क्रम आरजीबी में संग्रहीत है, इसलिए आपको आर और बी को स्वैप करना पड़ सकता है। यह आमतौर पर या तो आरजीबी या बीजीआर होता है।

तब मैं अंक (मैं read.csv को read.table परिवर्तित) प्लॉट करने के लिए अपने कोड का इस्तेमाल किया:

library(rgl) 
pcd <- read.csv(file.choose()) 
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)) 

और यह मैं क्या मिलता है:

enter image description here

तो मैं यह सोचते हैं रहा हूँ समस्या कोड के साथ है जहां आप पीसीडी फ़ाइल से अपना रंग पढ़ते हैं। बाकी मुझे ठीक लग रहा है।

अद्यतन: आपकी समस्या double प्रकार है। इसे float पर बदलें और इसे काम करना चाहिए। हालांकि को float के रूप में संग्रहीत करना कम से कम, संदिग्ध है। यह नाजुक है और यह गारंटी नहीं देता है कि रंग पढ़ने के बाद रंग सही होंगे। कुछ बिट्स बंद हो सकता है।

एक और नोट: आप फ़ाइल से संख्याओं को निकालने के लिए >> स्ट्रीम ऑपरेटर का उपयोग कर सकते हैं। इसे string विधियों के साथ मैन्युअल रूप से पार्स करने से कहीं अधिक आसान है। आप इसके बारे में पढ़ सकते हैं, उदाहरण के लिए, here

+0

आपके उत्तर के लिए बहुत बहुत धन्यवाद। यह बहुत दिलचस्प लग रहा है। मैं जो कोड इस्तेमाल करता हूं उसे पोस्ट करूंगा, फिर आप देख सकते हैं कि मैं कहां गलत हो गया हूं। –

+0

मैंने सी ++ कोड जोड़ा जो मैंने डेटा को पढ़ने के लिए उपयोग किया था। –

+1

मैंने आपके कोड के बारे में अपनी टिप्पणियों के साथ पोस्ट को अपडेट किया। – detunized