2013-04-12 53 views
8

Tôi cần chụp ảnh RGB màu từ máy ảnh Kinnect, nhưng tôi muốn hiển thị nó trong OpenCV vì đây chỉ là một phần của chương trình lớn hơn. Tôi biết OpenCV có khả năng tương thích với OpenNI nếu bạn thiết lập cờ, nhưng mặc dù tôi đã cố gắng hết sức CMake không thể tìm thấy đường dẫn đến OpenNI2 vì vậy tôi không thể xây dựng OpenCV với OpenNI. Dù sao tôi nghĩ rằng nó là tốt để biết làm thế nào để tự chuyển đổi khung OpenNI sang khung openCV, vì vậy tôi quyết định làm theo cách này.Chụp RGB từ Kinnect với Openni và hiển thị với OpenCV

Đối với chụp khung màu trong OpenNI tôi thử như sau:

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

Nhưng bây giờ tôi không hiểu làm thế nào để thực hiện chuyển đổi sang cv :: Mat.

Có ai đã từng làm điều này không?

Trả lời

11

Ok, trước tiên bạn nên tách riêng việc khởi tạo từ vòng lặp để đọc khung, theo cách này.

Khởi

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; 

Bây giờ đến vòng lặp chính cho việc đọc khung. Bạn đã làm hầu hết mọi thứ, điều duy nhất còn lại là sao chép bộ đệm vào openCV Mat.

Vòng cho việc đọc khung

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

cách thực hiện tương tự cho hình ảnh sâu? Tôi không thể tìm ra cách thay đổi CV_8U3 ... v.v. – MohamedEzz

1

Theo dõi về câu trả lời @ Jav_Rock của trên, cho IR và sâu các giải pháp tương tự, ngoại trừ như sau (ở vị trí của SENSOR_COLOR, CV_8UC3RGB888Pixel, tương ứng) :

Depth

  • Sensor loại: SENSOR_DEPTH
  • loại OpenCV: CV_16UC1
  • dữ liệu VideoFrameRef: DepthPixel

Lưu ý có thể bạn sẽ muốn thiết lập các PixelMode cho VideoFormat của dòng video để PIXEL_FORMAT_DEPTH_100_UM khác hình ảnh sâu của bạn sẽ trông rất đen .

IR

  • Sensor loại: SENSOR_IR
  • OpenCV loại: CV_16UC1
  • VideoFrameRef dữ liệu: Grayscale16Pixel

Cuối cùng, lưu ý rằng không sâu cũng không IR cần cv::cvtColor gọi.