尾号分布图:HighGUI?

使用Kinect傳感器?

河北快三遗漏分布图 www.ainysi.com.cn 類 VideoCapture 支持Kinect傳感器。使用 VideoCapture 里的接口,可以從Kinect獲取深度圖,RGB圖像和其他格式的輸出。

為了在OpenCV中使用Kinect,你需要遵循如下主要步驟。

  1. 安裝OpenNI庫 (從此處獲取 //www.openni.org/downloadfiles) 以及 PrimeSensor Module for OpenNI (從此處獲取 https://github.com/avin2/SensorKinect )。使用它們的缺省安裝目錄安裝則可。安裝目錄如下:

    OpenNI:
        Linux & MacOSX:
            Libs into: /usr/lib
            Includes into: /usr/include/ni
        Windows:
            Libs into: c:/Program Files/OpenNI/Lib
            Includes into: c:/Program Files/OpenNI/Include
    PrimeSensor Module:
        Linux & MacOSX:
            Bins into: /usr/bin
        Windows:
            Bins into: c:/Program Files/Prime Sense/Sensor/Bin
    

    如果其中一個或者多個被安裝到其他目錄,你應該修改與之對應的CMake變量 OPENNI_LIB_DIR , OPENNI_INCLUDE_DIR 或/和 OPENNI_PRIME_SENSOR_MODULE_BIN_DIR 。

  2. 通過CMake中的 WITH_OPENNI 標志配置OpenCV的OpenNI支持。無論發現PrimeSensor??橛敕瘢觳镃Make log中的 OpenNI PrimeSensor Modules 狀態),如果在安裝目錄中發現了OpenNI(檢查CMake log中的 OpenNI 狀態),OpenCV都將會使用OpenNI編譯。沒有PrimeSensor???,OpenCV也可成功地與OpenNI編譯,但是 VideoCapture 對象無法從Kinect傳感器中抓取數據。

  3. 編譯OpenCV。

VideoCapture 可以獲取如下Kinect數據:

  1. 來自深度傳感器的數據:
    • OPENNI_DEPTH_MAP - 以毫米為單位的深度值 (CV_16UC1)
    • OPENNI_POINT_CLOUD_MAP - 以米為單位的XYZ點云 (CV_32FC3)
    • OPENNI_DISPARITY_MAP - 以像素為單位的視差 (CV_8UC1)
    • OPENNI_DISPARITY_MAP_32F - 以像素為單位的視差 (CV_32FC1)
    • OPENNI_VALID_DEPTH_MASK - 有效像素標志 (非遮擋,非影子區等) (CV_8UC1)
  2. 來自RGB圖像傳感器的數據:
    • OPENNI_BGR_IMAGE - 彩色圖像 (CV_8UC3)
    • OPENNI_GRAY_IMAGE - 灰度圖像 (CV_8UC1)

為了從Kinect獲取深度圖,請使用 VideoCapture::operator >>, 例如

VideoCapture capture( CV_CAP_OPENNI );
for(;;)
{
    Mat depthMap;
    capture >> depthMap;

    if( waitKey( 30 ) >= 0 )
        break;
}

如果獲取多個Kinect數據,請使用 VideoCapture::grabVideoCapture::retrieve, 例如

VideoCapture capture(0); // or CV_CAP_OPENNI
for(;;)
{
    Mat depthMap;
    Mat rgbImage

    capture.grab();

    capture.retrieve( depthMap, OPENNI_DEPTH_MAP );
    capture.retrieve( bgrImage, OPENNI_BGR_IMAGE );

    if( waitKey( 30 ) >= 0 )
        break;
}

設置或者獲取Kinect數據屬性,請分別使用 VideoCapture::setVideoCapture::get 。例如

VideoCapture capture( CV_CAP_OPENNI );
capture.set( CV_CAP_OPENNI_IMAGE_GENERATOR_OUTPUT_MODE, CV_CAP_OPENNI_VGA_30HZ );
cout << "FPS    " << capture.get( CV_CAP_OPENNI_IMAGE_GENERATOR+CV_CAP_PROP_FPS ) << endl;

既然Kinect有兩個數據傳感器(圖像傳感器和深度傳感器),因此有兩個標志用來設置/獲取指定傳感器的屬性:

  • CV_CAP_OPENNI_IMAGE_GENERATOR – 讀寫圖像傳感器屬性的標志。
  • CV_CAP_OPENNI_DEPTH_GENERATOR – 讀寫深度傳感器屬性的標志。此標志為默認值,如果這兩個標志都沒有設置,則為此標志。

當讀寫特定傳感器屬性時,必須用此標志指定傳感器。如下屬性可透過OpenNI接口支持:

  • 圖像傳感器:

    • CV_CAP_PROP_OPENNI_OUTPUT_MODE – 支持兩種模式:缺省的 CV_CAP_OPENNI_VGA_30HZ (圖像傳感器以30FPS速度返回VGA分辨率的圖像) 或者 CV_CAP_OPENNI_SXGA_15HZ (圖像傳感器以15FPS速度返回SXGA分辨率的圖像);深度傳感器一直是VGA分辨率。
  • 深度傳感器:

    • CV_CAP_PROP_OPENNI_REGISTRATION – 此標志用來校準深度圖,通過改變深度傳感器的視點到圖像傳感器,這樣兩圖中同一位置的像素表示同一物體(需將此標志設置為 "on"); 或者設置深度傳感器的視點為其本來的視點(需將此標志設置為 "off").

      下面的屬性僅可讀?。?/p>

    • CV_CAP_PROP_OPENNI_FRAME_MAX_DEPTH – Kinect支持的最大距離,以毫米為單位。

    • CV_CAP_PROP_OPENNI_BASELINE – Baseline值,以毫米為單位。

    • CV_CAP_PROP_OPENNI_FOCAL_LENGTH – 焦距,以像素為單位。

    • CV_CAP_PROP_FRAME_WIDTH – 幀的寬度,以像素為單位。

    • CV_CAP_PROP_FRAME_HEIGHT – 幀的高度,以像素為單位。

    • CV_CAP_PROP_FPS – 幀率,以FPS為單位。

  • 一些”generator type + property”被定以為一個標志:

    • CV_CAP_OPENNI_IMAGE_GENERATOR_OUTPUT_MODE = CV_CAP_OPENNI_IMAGE_GENERATOR + CV_CAP_PROP_OPENNI_OUTPUT_MODE
    • CV_CAP_OPENNI_DEPTH_GENERATOR_BASELINE = CV_CAP_OPENNI_DEPTH_GENERATOR + CV_CAP_PROP_OPENNI_BASELINE
    • CV_CAP_OPENNI_DEPTH_GENERATOR_FOCAL_LENGTH = CV_CAP_OPENNI_DEPTH_GENERATOR + CV_CAP_PROP_OPENNI_FOCAL_LENGTH
    • CV_CAP_OPENNI_DEPTH_GENERATOR_REGISTRATION_ON = CV_CAP_OPENNI_DEPTH_GENERATOR + CV_CAP_PROP_OPENNI_REGISTRATION_ON

更多信息,請參考 opencv/samples/cpp 目錄中的Kinect例子 kinect_maps.cpp 。

翻譯?

于仕琪 //www.ainysi.com.cn

Table Of Contents

Previous topic

Features2d

Next topic

級聯分類器訓練

This Page