我如何将RGB888Pixel图像复制到RGB字节流数组?

时间:2014-07-18 19:44:29

标签: opencv openni

我有2段此代码:

openni::RGB888Pixel* buffer = (openni::RGB888Pixel*)frame.getData();

...

typedef boost::shared_ptr<CPPImage> Image;
Image rgb;
rgb=Image(new CPPImage(640,480,3));

...

byte* dst=rgb->get_row(0);

我想将数据从缓冲区复制到dest。 dest是RGB图像。 我是怎么做到的?

1 个答案:

答案 0 :(得分:2)

openni RGB888Pixel数组中的数据可以解释为大小高度*宽* 3的uchar 1维数组。此数组的每个uchar都会告诉您每个像素的红色,绿色或蓝色值。顺序将是行和rgb,因此数组将类似于

r_1,g_1,b_1,r_2,g_2,b2.....

考虑到这一点,您可以使用memcpy将数据复制到以相同方式组织数据的任何图像容器(即opencv Mat)。以下是使用opencv图像作为示例的my code片段

cv::Mat cv_image;
const openni::RGB888Pixel* imageBuffer = (const openni::RGB888Pixel*)colorFrame.getData();
cv_image.create(colorFrame.getHeight(), colorFrame.getWidth(), CV_8UC3);
memcpy( cv_image.data, imageBuffer,3*colorFrame.getHeight()*colorFrame.getWidth()*sizeof(uint8_t) ); 

对于其他图像容器,您必须确保数组中的顺序是正确的。如果它不是相同的顺序,只需在openni数据中执行for并以正确的顺序复制它...(虽然这可能会更慢)