我有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图像。 我是怎么做到的?
答案 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并以正确的顺序复制它...(虽然这可能会更慢)