使用Kinect和其他OpenNI兼容的深度傳感器

2018-10-04 12:29 更新

通過VideoCapture類支持與OpenNI(Kinect,XtionPRO,...)兼容的深度傳感器。深度圖,BGR圖像和其他一些格式的輸出可以通過使用熟悉的VideoCapture界面來檢索。

為了在OpenCV中使用深度傳感器,您應(yīng)該執(zhí)行以下初步步驟:

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

如果一個(gè)或兩個(gè)產(chǎn)品安裝到其他文件夾,用戶應(yīng)該更改相應(yīng)的CMake變量OPENNI_LIB_DIR,OPENNI_INCLUDE_DIR或/和OPENNI_PRIME_SENSOR_MODULE_BIN_DIR。

  • 通過在CMake中設(shè)置WITH_OPENNI標(biāo)志來配置具有OpenNI支持的OpenCV。如果在安裝文件夾中找到OpenNI,則OpenCV將使用OpenNI庫(請(qǐng)參閱CMake日志中的OpenNI狀態(tài)),而無法找到PrimeSensor模塊(請(qǐng)參閱CMake日志中的OpenNI PrimeSensor模塊狀態(tài))。沒有PrimeSensor模塊OpenCV將使用OpenNI庫成功編譯,但VideoCapture對(duì)象不會(huì)從Kinect傳感器中獲取數(shù)據(jù)。
  • 構(gòu)建OpenCV。

VideoCapture可以檢索以下數(shù)據(jù):

  1. 深度發(fā)生器給出的數(shù)據(jù):CAP_OPENNI_DEPTH_MAP - 以mm為單位的深度值(CV_16UC1)CAP_OPENNI_POINT_CLOUD_MAP - XYZ(米)(CV_32FC3)CAP_OPENNI_DISPARITY_MAP - 像素差異(CV_8UC1)CAP_OPENNI_DISPARITY_MAP_32F - 像素差異(CV_32FC1)CAP_OPENNI_VALID_DEPTH_MASK - 有效像素的掩碼(不遮擋,不陰影等)(CV_8UC1)
  2. BGR圖像發(fā)生器提供的數(shù)據(jù):CAP_OPENNI_BGR_IMAGE - 彩色圖像(CV_8UC3)CAP_OPENNI_GRAY_IMAGE - 灰色圖片(CV_8UC1)

為了從深度傳感器獲取深度圖使用VideoCapture :: operator >>,例如:

VideoCapture capture( CAP_OPENNI );
for(;;)
{
    Mat depthMap;
    capture >> depthMap;
    if( waitKey( 30 ) >= 0 )
        break;
}

要獲取幾個(gè)數(shù)據(jù)地圖,請(qǐng)使用VideoCapture :: grab和VideoCapture :: retrieve,例如:

VideoCapture capture(0); // or CAP_OPENNI
for(;;)
{
    Mat depthMap;
    Mat bgrImage;
    capture.grab();
    capture.retrieve( depthMap, CAP_OPENNI_DEPTH_MAP );
    capture.retrieve( bgrImage, CAP_OPENNI_BGR_IMAGE );
    if( waitKey( 30 ) >= 0 )
        break;
}

為了設(shè)置和獲取傳感器數(shù)據(jù)生成器的某些屬性,請(qǐng)分別使用VideoCapture :: set和VideoCapture :: get方法,例如:

VideoCapture capture( CAP_OPENNI );
capture.set( CAP_OPENNI_IMAGE_GENERATOR_OUTPUT_MODE, CAP_OPENNI_VGA_30HZ );
cout << "FPS    " << capture.get( CAP_OPENNI_IMAGE_GENERATOR+CAP_PROP_FPS ) << endl;

由于支持兩種類型的傳感器數(shù)據(jù)生成器(圖像生成器和深度生成器),因此需要使用兩個(gè)標(biāo)志來設(shè)置/獲取所需生成器的屬性:

  • CAP_OPENNI_IMAGE_GENERATOR - 用于訪問圖像生成器屬性的標(biāo)志。
  • CAP_OPENNI_DEPTH_GENERATOR - 用于訪問深度生成器屬性的標(biāo)志。默認(rèn)情況下假設(shè)該標(biāo)志值,如果兩個(gè)可能的屬性值都未設(shè)置。

一些深度傳感器(例如XtionPRO)沒有圖像生成器。為了檢查它,您可以獲得CAP_OPENNI_IMAGE_GENERATOR_PRESENT屬性。

bool isImageGeneratorPresent = capture.get( CAP_PROP_OPENNI_IMAGE_GENERATOR_PRESENT ) != 0; // or == 1

指定所需發(fā)電機(jī)類型的標(biāo)志必須與特定發(fā)電機(jī)屬性結(jié)合使用。支持通過OpenNI接口提供的以下相機(jī)屬性:

  • 對(duì)于圖像發(fā)生器:
    • CAP_PROP_OPENNI_OUTPUT_MODE - 支持三種輸出模式:默認(rèn)使用CAP_OPENNI_VGA_30HZ(圖像生成器以30 FPS的VGA分辨率返回圖像),CAP_OPENNI_SXGA_15HZ(圖像生成器以15 FPS的SXGA分辨率返回圖像)和CAP_OPENNI_SXGA_30HZ(圖像生成器以SXGA分辨率返回圖像30 FPS,該模式由XtionPRO Live支持); 深度發(fā)生器的地圖總是在VGA分辨率。
  • 對(duì)于深度發(fā)生器:
    1. CAP_PROP_OPENNI_REGISTRATION - 通過更改深度生成器的視點(diǎn)(如果標(biāo)志為“開”)將重映射深度圖注冊(cè)到圖像映射的標(biāo)志,或?qū)⒋艘晥D點(diǎn)設(shè)置為其正常點(diǎn)(如果標(biāo)志為“關(guān)閉”)。注冊(cè)過程的結(jié)果圖像是像素對(duì)齊的,這意味著圖像中的每個(gè)像素都與深度圖像中的像素對(duì)齊。下一個(gè)屬性可用于獲取:
    2. CAP_PROP_OPENNI_FRAME_MAX_DEPTH - Kinect的最大支持深度(mm)。
    3. CAP_PROP_OPENNI_BASELINE - 基準(zhǔn)值,單位為mm。
    4. CAP_PROP_OPENNI_FOCAL_LENGTH - 以像素為單位的焦距。
    5. CAP_PROP_FRAME_WIDTH - 幀寬度(以像素為單位)。
    6. CAP_PROP_FRAME_HEIGHT - 幀高度(以像素為單位)。
    7. CAP_PROP_FPS - FPS中的幀速率。

一些典型的標(biāo)志組合“生成器類型+屬性”被定義為單個(gè)標(biāo)志:

    1. CAP_OPENNI_IMAGE_GENERATOR_OUTPUT_MODE = CAP_OPENNI_IMAGE_GENERATOR + CAP_PROP_OPENNI_OUTPUT_MODE
    2. CAP_OPENNI_DEPTH_GENERATOR_BASELINE = CAP_OPENNI_DEPTH_GENERATOR + CAP_PROP_OPENNI_BASELINE
    3. CAP_OPENNI_DEPTH_GENERATOR_FOCAL_LENGTH = CAP_OPENNI_DEPTH_GENERATOR + CAP_PROP_OPENNI_FOCAL_LENGTH
    4. CAP_OPENNI_DEPTH_GENERATOR_REGISTRATION = CAP_OPENNI_DEPTH_GENERATOR + CAP_PROP_OPENNI_REGISTRATION

有關(guān)更多信息,請(qǐng)參閱opencv / samples / cpp文件夾中openni_capture.cpp的使用示例。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)