从Kinnect捕捉RGB与Openni与OpenCV的显示(Capture RGB from Ki

2019-08-22 05:46发布

我需要从Kinnect相机捕捉彩色RGB图像,但我想表明它在OpenCV的,因为这仅仅是一个更大的计划的一部分。 我知道,OpenCV的与OpenNI的兼容性如果设置了标志,但尽管我努力的CMake找不到路径OpenNI2所以我不能OpenNI建OpenCV的。 无论如何,我认为这是好事,知道如何手动OpenNI帧转换为OpenCV的框架,所以我决定遵循这种方式。

在OpenNI捕获彩色帧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();

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

但现在我不知道该怎么办转换为CV ::垫。

是否有任何人manged做到这一点?

Answer 1:

好吧,首先,你应该从循环的读码框,这样分开的初始化。

初始化

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;

现在来读帧主循环。 你所做的几乎一切,唯一剩下的事情就是缓冲区拷贝到OpenCV的垫。

回路的阅读框

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
}


Answer 2:

对@ Jav_Rock的回答随访以上,红外和深度的解决方案是相似的,除了以下(代替SENSOR_COLORCV_8UC3RGB888Pixel ,分别对应)。

深度

  • 传感器类型: SENSOR_DEPTH
  • OpenCV的类型: CV_16UC1
  • VideoFrameRef数据: DepthPixel

请注意,你可能会想设置PixelMode对视频流的VideoFormat到PIXEL_FORMAT_DEPTH_100_UM否则你的深度图像会显得很黑。

  • 传感器类型: SENSOR_IR
  • OpenCV的类型: CV_16UC1
  • VideoFrameRef数据: Grayscale16Pixel

最后,请注意,无论是深度还是IR需要的cv::cvtColor电话。



文章来源: Capture RGB from Kinnect with Openni and show with OpenCV