2013-04-12 4 views
8

Ho bisogno di acquisire l'immagine RGB a colori da una fotocamera Kinnect, ma voglio mostrarlo in OpenCV in quanto questa è solo una parte di un programma più grande. So che OpenCV ha compatibilità con OpenNI se si imposta il flag, ma anche se ho provato hard CMake non è riuscito a trovare il percorso di OpenNI2 quindi non ho potuto creare OpenCV con OpenNI. Comunque penso che sia bello sapere come convertire manualmente i frame OpenNI in frame openCV, così ho deciso di seguire questa strada.Acquisisci RGB da Kinnect con Openni e mostra con OpenCV

Per catturare il telaio di colore in OpenNI ho provato la seguente:

openni::Device device; 
openni::VideoStream color; 
openni::VideoFrameRef colorFrame; 

rc = openni::OpenNI::initialize(); 
rc = device.open(openni::ANY_DEVICE); 
rc = color.create(device, openni::SENSOR_COLOR); 
rc = color.start(); 

color.readFrame(&colorFrame); 
const openni::RGB888Pixel* imageBuffer = (const openni::RGB888Pixel*)colorFrame.getData(); 

Ma ora non capisco come fare la conversione al cv :: Mat.

Qualcuno ha qualche cosa da fare?

risposta

11

Ok, per prima cosa dovresti separare l'inizializzazione dal ciclo per leggere i frame, in questo modo.

inizializzazione

openni::Device device; 
openni::VideoStream color; 
openni::VideoFrameRef colorFrame; 

rc = openni::OpenNI::initialize(); 
rc = device.open(openni::ANY_DEVICE); 
rc = color.create(device, openni::SENSOR_COLOR); 
rc = color.start(); 

Mat frame; 

Ora arriva il ciclo principale per la lettura di fotogrammi. Hai fatto quasi tutto, l'unica cosa che rimane è copiare il buffer sul Mat openCV.

Loop per la lettura di fotogrammi

while (true) 
{ 
    color.readFrame(&colorFrame); 
    const openni::RGB888Pixel* imageBuffer = (const openni::RGB888Pixel*)colorFrame.getData(); 

    frame.create(colorFrame.getHeight(), colorFrame.getWidth(), CV_8UC3); 
    memcpy(frame.data, imageBuffer, 3*colorFrame.getHeight()*colorFrame.getWidth()*sizeof(uint8_t)); 

    cv::cvtColor(frame,frame,CV_BGR2RGB); //this will put colors right 
} 
+0

come fare lo stesso per l'immagine di profondità? Non riesco a capire come cambiare il CV_8U3 ... ecc. – MohamedEzz

1

seguito alle @ di Jav_Rock risposta di cui sopra, per IR e profondità la soluzione è simile, tranne che per i seguenti (al posto di SENSOR_COLOR, CV_8UC3 e RGB888Pixel, rispettivamente) :

Profondità

  • Tipo di sensore: SENSOR_DEPTH
  • Tipo OpenCV: CV_16UC1
  • dati VideoFrameRef: DepthPixel

Nota probabilmente si vorrà impostare il PixelMode per videoformat del VideoStream per PIXEL_FORMAT_DEPTH_100_UM altrimenti la vostra immagine di profondità sarà molto nero .

IR

  • Tipo sensore: SENSOR_IR
  • tipo OpenCV: CV_16UC1
  • dati VideoFrameRef: Grayscale16Pixel

Infine, si noti che né profondità, né IR bisogno la chiamata cv::cvtColor.