2013-04-12 12 views
8

Ich muss das Farb-RGB-Bild von einer Kinnect-Kamera erfassen, aber ich möchte es in OpenCV zeigen, da dies nur ein Teil eines größeren Programms ist. Ich weiß, dass OpenCV Kompatibilität mit OpenNI hat, wenn Sie das Flag setzen, aber obwohl ich versucht habe, konnte CMake den Pfad zu OpenNI2 nicht finden, also konnte ich OpenCV mit OpenNI nicht bauen. Wie auch immer, ich denke, es ist gut zu wissen, wie man OpenNI-Frames manuell in OpenCV-Frames umwandelt, also entschied ich mich, diesem Weg zu folgen.Capture RGB von Kinnect mit Openni und Show mit OpenCV

Für den Farbrahmen in OpenNI Erfassung habe ich versucht, die folgenden:

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

Aber jetzt verstehe ich nicht, wie die Umstellung auf cv tun :: Mat.

Hat irgendjemand dazu beigetragen, dies zu tun?

Antwort

11

Ok, zuerst sollten Sie die Initialisierung von der Schleife für das Lesen von Frames trennen, so.

Initialisierung

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; 

Jetzt kommt die Hauptschleife Rahmen für das Lesen. Sie haben fast alles gemacht, das einzige, was übrig bleibt, ist den Puffer auf die openCV-Matte zu kopieren.

Schleife für Leserahmen

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

Wie mache ich das gleiche für das Tiefenbild? Ich kann nicht herausfinden, wie man den CV_8U3 ändert ... etc. – MohamedEzz

1

auf @ oben Jav_Rock Antwort Anknüpfend, für IR und Tiefe der Lösung ist ähnlich, mit Ausnahme der folgenden (anstelle von SENSOR_COLOR, CV_8UC3 und RGB888Pixel, respectively) :

Tiefe

  • Sensortyp: SENSOR_DEPTH
  • OpenCV Typ: CV_16UC1
  • VideoFrameRef Daten: DepthPixel

Hinweis Sie werden wahrscheinlich wollen die PixelMode für den Videostream des Videoformat zu PIXEL_FORMAT_DEPTH_100_UM sonst Ihre Tiefenbild sehr schwarz aussehen wird eingestellt .

IR

  • Sensortyp: SENSOR_IR
  • OpenCV Typ: CV_16UC1
  • VideoFrameRef Daten: Grayscale16Pixel

Schließlich ist zu beachten, dass weder Tiefe noch IR müssen die cv::cvtColor Anruf.