2013-04-12 13 views
8

Potrzebuję przechwycić kolorowy obraz RGB z kamery Kinnect, ale chcę go pokazać w OpenCV, ponieważ jest to tylko część większego programu. Wiem, że OpenCV ma kompatybilność z OpenNI, jeśli ustawisz flagę, ale chociaż spróbowałem ciężko CMake nie mógł znaleźć ścieżki do OpenNI2, więc nie mogłem zbudować OpenCV z OpenNI. W każdym razie myślę, że dobrze jest wiedzieć, jak ręcznie konwertować ramki OpenNI do ramek openCV, więc postanowiłem podążać tą drogą.Przechwyć RGB z Kinnect z Openni i pokaż z OpenCV

do robienia ramkę koloru w OpenNI Próbowałem następujące:

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

Ale teraz nie rozumiem, jak to zrobić konwersję do cv :: Mat.

Czy ktokolwiek to wymyślił?

Odpowiedz

11

Ok, najpierw należy oddzielić inicjalizację od pętli do odczytu ramek w ten sposób.

Inicjowanie

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; 

Teraz przychodzi główną pętlę na czytanie ramek. Zrobiłeś prawie wszystko, jedyne co zostało, to skopiować bufor do maty OpenCV.

pętli dla ramek odczytu

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

jak zrobić to samo dla obrazu głębi? Nie mogę wymyślić jak zmienić CV_8U3 ... itd. – MohamedEzz

1

Nawiązując do użytkownika @ Jav_Rock odpowiedź powyżej, IR i głębokość rozwiązania jest podobne, z wyjątkiem następujących (w miejsce SENSOR_COLOR, CV_8UC3 i RGB888Pixel, odpowiednio) :

Głębokość

  • Typ czujnika: SENSOR_DEPTH
  • typ OpenCV: CV_16UC1
  • dane VideoFrameRef: DepthPixel

Uwaga prawdopodobnie będziesz chciał ustawić PixelMode dla VideoFormat w VideoStream do PIXEL_FORMAT_DEPTH_100_UM inaczej głębię obrazu będzie wyglądać bardzo czarny .

IR

  • Typ czujnika: SENSOR_IR
  • typ OpenCV: CV_16UC1
  • VideoFrameRef dane: Grayscale16Pixel

Wreszcie, należy pamiętać, że ani głębokość, ani IR potrzeba połączenia cv::cvtColor.