Kinect开发(3)RGB数据获取

    RGB数据的获取与景深数据获取类似,不同的就是数据帧的数据格式是openni::RGB888Pixel类型的。直接通过代码来了解:

 1 #include <conio.h>
 2 #include <iostream>
 3 using namespace std;
 4 
 5 #include <OpenNI.h>
 6 #pragma comment(lib, "openni2.lib")
 7 
 8 #include <opencv/cv.h>
 9 #include <opencv/highgui.h>
10 #pragma comment(lib, "opencv_core244.lib")
11 #pragma comment(lib, "opencv_highgui244.lib")
12 #pragma comment(lib, "opencv_imgproc244.lib")
13 
14 class NewColorFrameListener
15     : public openni::VideoStream::NewFrameListener
16 {
17 public:
18     virtual void onNewFrame(openni::VideoStream& stream)
19     {
20         openni::VideoFrameRef frame;
21         stream.readFrame(&frame);
22         if (frame.isValid())
23         {
24             if (frame.getSensorType() == openni::SENSOR_COLOR)
25             {
26                 cv::Mat rgbImg(frame.getHeight(), frame.getWidth(), CV_8UC3, (void*)frame.getData());
27                 cv::Mat bgrImg;
28                 cvtColor(rgbImg, bgrImg, CV_RGB2BGR);
29                 IplImage* img = cvCreateImage(cvSize(frame.getWidth(), frame.getHeight()), 8, 3);
30                 img->imageData = (char*)bgrImg.data;
31                 cvShowImage("wnd", img);
32                 cvReleaseImage(&img);
33             }
34         }
35     }
36 };
37 
38 int main()
39 {
40     openni::Status rc = openni::STATUS_OK;
41     NewColorFrameListener listener;
42     rc = openni::OpenNI::initialize();
43     if (rc != openni::STATUS_OK)
44     {
45         cout<<"initialize failed:"<<openni::OpenNI::getExtendedError()<<endl;
46         return 1;
47     }
48     openni::Device device;
49     rc = device.open(openni::ANY_DEVICE);
50     if (rc != openni::STATUS_OK)
51     {
52         openni::OpenNI::shutdown();
53         cout<<"open device failed:"<<openni::OpenNI::getExtendedError()<<endl;
54         return 0;
55     }
56     openni::VideoStream colorStream;
57     rc = colorStream.create(device, openni::SENSOR_COLOR);
58     if (rc != openni::STATUS_OK)
59     {
60         openni::OpenNI::shutdown();
61         cout<<"create color stream failed:"<<openni::OpenNI::getExtendedError()<<endl;
62         return 0;
63     }
64     cvNamedWindow("wnd", CV_WINDOW_AUTOSIZE);
65     openni::VideoFrameRef frame;
66     colorStream.start();
67     colorStream.addNewFrameListener(&listener);
68     while (true)
69     {
70         if (cvWaitKey(30) == 27)
71             break;
72     }
73 
74     cvDestroyWindow("wnd");
75     colorStream.stop();
76     colorStream.destroy();
77     device.close();
78     openni::OpenNI::shutdown();
79     return 0;
80 }

    其中,38-80行的main函数就不用多说了,基本与景深数据的获取类似。

    在NewColorFrameListener类中的onNewFrame方法里处理并显示RGB数据。我们直接把相应的数据通过OpenCV来展示,注意,由于Kinect获取的格式是RGB的,而OpenCV处理数据的内部结构是BGR方式排列的,所以,在显示之前,需要进行一次颜色空间的转换。直接通过cvtColor方法转换即可。

原文地址:https://www.cnblogs.com/tszhao/p/3108034.html