• 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方法转换即可。

  • 相关阅读:
    常用的网站cms内容管理系统推荐
    PageAdmin网站内容管理系统出现403错误的解决方法
    使用PageAdmin网站内容管理系统做网站的好处
    网站建设步骤及常用建站系统分享
    企业网站建设如何选择建站公司
    如何采用PageAdmin自助建站系统来进行企业网站建设
    站群系统-站群软件系统推荐
    js计算之递归
    算法之插入排序
    javaScript设计模式之常用工厂模式
  • 原文地址:https://www.cnblogs.com/tszhao/p/3108034.html
Copyright © 2020-2023  润新知