我需要从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做到这一点?
好吧,首先,你应该从循环的读码框,这样分开的初始化。
初始化
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
}
对@ Jav_Rock的回答随访以上,红外和深度的解决方案是相似的,除了以下(代替SENSOR_COLOR
, CV_8UC3
和RGB888Pixel
,分别对应)。
深度
- 传感器类型:
SENSOR_DEPTH
- OpenCV的类型:
CV_16UC1
- VideoFrameRef数据:
DepthPixel
请注意,你可能会想设置PixelMode对视频流的VideoFormat到PIXEL_FORMAT_DEPTH_100_UM
否则你的深度图像会显得很黑。
与
- 传感器类型:
SENSOR_IR
- OpenCV的类型:
CV_16UC1
- VideoFrameRef数据:
Grayscale16Pixel
最后,请注意,无论是深度还是IR需要的cv::cvtColor
电话。