将Kinect传感器的彩色图像读入cv :: Mat

时间:2014-06-03 13:21:12

标签: opencv types kinect

我有一个简单的问题:

我讨厌将RGB图片存储在数组中,并希望将其放入cv:Mat。

我已经使用Kinect传感器的Depth Image完成了这个:

VideoFrameRef lDepthFrame;
lStatus = gDepthVideoStream.readFrame(&lDepthFrame);

cv::Mat lDepthMat(lDepthFrame.getHeight(), lDepthFrame.getWidth(), CV_16U, (uint16_t*)lDepthFrame.getData());

我现在的问题是,我无法找出用于彩色图像的类型(上面我使用的是CV_16U)。彩色图像采用RGB888 / RGB24。所以它是3个字节大,每种颜色一个。

所以我对彩色图像的含义是这样的:

VideoFrameRef lColorFrame;
lStatus = gRgbVideoStream.readFrame(&lColorFrame);
cv::Mat lRgbMat(lColorFrame.getHeight(), lColorFrame.getWidth(), <????>, (<????>*)lColorFrame.getData());

我需要更换上述代码才能使此功能正常工作。

非常感谢您阅读并希望回答。如果这里有很多拼写错误,我真的很抱歉我的英语。我不是母语人士

2 个答案:

答案 0 :(得分:0)

RGB888在opencv-speak,8位无符号值,3个通道中为CV_8UC3

如果RGB实际上是BGR,可能会出现问题 - 但您可以稍后更换频道。

答案 1 :(得分:0)

你可以做一些简单的事情:

IColorFrame* pColorFrame = nullptr;
cv::Mat image;
if (SUCCEEDED(m_pColorFrameReader->AcquireLatestFrame(&pColorFrame)) {

    // First you probably would like to get the image dimensions coming from your kinect device
    IFrameDescription* pFrameDescription = nullptr;
    int nWidth = 0;
    int nHeight = 0;

    pColorFrame->get_FrameDescription(&pFrameDescription);
    pFrameDescription->get_Width(&nWidth);
    pFrameDescription->get_Height(&nHeight);

    // now you just need to allocate your opencv matrix and copy the data from the IColorFrame object
    imageData.create(nHeight, nWidth , CV_8UC4);
    BYTE* imgDataPtr = (BYTE*)imageData.data;
    pColorFrame->CopyConvertedFrameDataToArray(nWidth * nHeight * 4, imgDataPtr, ColorImageFormat_Bgra);

    // release your pointer
    pFrameDescription->Release();
    pFrameDescription = nullptr;
}

pColorFrame->Release();
pColorFrame = nullptr;

之后你可以简单地使用opencv方法来显示图像;

cv::imshow("Kinect Image", image);