OpenCV 4.12.0
開源計算機視覺
載入中...
搜尋中...
無匹配項
使用 Kinect 和其他 OpenNI 相容的深度感測器

前一篇教程: 使用 OpenCV 建立影片
下一篇教程: 使用 Orbbec Astra 3D 相機

VideoCapture 類支援與 OpenNI 相容的深度感測器(Kinect、XtionPRO 等)。可以使用熟悉的 VideoCapture 介面檢索深度圖、BGR 影像和其他格式的輸出。

為了在 OpenCV 中使用深度感測器,您應該執行以下初步步驟

  1. 安裝 OpenNI 庫(從這裡 http://www.openni.org/downloadfiles)和 PrimeSensor Module for OpenNI(從這裡 https://github.com/avin2/SensorKinect)。安裝應在這些產品的說明中列出的預設資料夾中完成,例如
    OpenNI
    Linux & MacOSX
    庫檔案放入:/usr/lib
    包含檔案放入:/usr/include/ni
    Windows
    庫檔案放入:c:/Program Files/OpenNI/Lib
    包含檔案放入:c:/Program Files/OpenNI/Include
    PrimeSensor Module
    Linux & MacOSX
    二進位制檔案放入:/usr/bin
    Windows
    二進位制檔案放入: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 的支援。如果在安裝資料夾中找到 OpenNI,OpenCV 將使用 OpenNI 庫構建(請參閱 CMake 日誌中的 OpenNI 狀態),而 PrimeSensor Modules 可能無法找到(請參閱 CMake 日誌中的 OpenNI PrimeSensor Modules 狀態)。如果沒有 PrimeSensor 模組,OpenCV 將成功編譯 OpenNI 庫,但 VideoCapture 物件將無法從 Kinect 感測器獲取資料。
  3. 構建 OpenCV。

VideoCapture 可以檢索以下資料

  1. 來自深度生成器的資料
    • CAP_OPENNI_DEPTH_MAP - 以毫米為單位的深度值 (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 影像生成器的資料
    • 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;
}

為了獲取多個數據圖,請使用 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;
}

為了設定和獲取感測器資料生成器的某些屬性,請分別使用 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;

由於支援兩種型別的感測器資料生成器(影像生成器和深度生成器),因此應使用兩個標誌來設定/獲取所需生成器的屬性

  • CAP_OPENNI_IMAGE_GENERATOR – 用於訪問影像生成器屬性的標誌。
  • CAP_OPENNI_DEPTH_GENERATOR – 用於訪問深度生成器屬性的標誌。如果未設定屬性的兩個可能值中的任何一個,則預設情況下假定此標誌值。

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

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

指定所需生成器型別的標誌必須與特定的生成器屬性組合使用。支援以下透過 OpenNI 介面提供的相機的屬性

  • 對於影像生成器
    • CAP_PROP_OPENNI_OUTPUT_MODE – 支援三種輸出模式:CAP_OPENNI_VGA_30HZ 預設使用(影像生成器以 VGA 解析度和 30 FPS 返回影像)、CAP_OPENNI_SXGA_15HZ(影像生成器以 SXGA 解析度和 15 FPS 返回影像)和 CAP_OPENNI_SXGA_30HZ(影像生成器以 SXGA 解析度和 30 FPS 返回影像,該模式由 XtionPRO Live 支援);深度生成器的地圖始終為 VGA 解析度。
  • 對於深度生成器
    • CAP_PROP_OPENNI_REGISTRATION – 透過更改深度生成器的視點(如果該標誌為“開啟”)或將此視點設定為其正常視點(如果該標誌為“關閉”)來註冊將深度圖重新對映到影像圖的標誌。註冊過程生成的影像是畫素對齊的,這意味著影像中的每個畫素都與深度影像中的畫素對齊。

      以下屬性僅可用於獲取

    • CAP_PROP_OPENNI_FRAME_MAX_DEPTH – Kinect 的最大支援深度(以毫米為單位)。
    • CAP_PROP_OPENNI_BASELINE – 基線值(以毫米為單位)。
    • CAP_PROP_OPENNI_FOCAL_LENGTH – 焦距(以畫素為單位)。
    • CAP_PROP_FRAME_WIDTH – 幀寬度(以畫素為單位)。
    • CAP_PROP_FRAME_HEIGHT – 幀高度(以畫素為單位)。
    • CAP_PROP_FPS – 幀率(以 FPS 為單位)。
  • 一些典型的標誌組合“生成器型別 + 屬性”定義為單個標誌
    • CAP_OPENNI_IMAGE_GENERATOR_OUTPUT_MODE = CAP_OPENNI_IMAGE_GENERATOR + CAP_PROP_OPENNI_OUTPUT_MODE
    • CAP_OPENNI_DEPTH_GENERATOR_BASELINE = CAP_OPENNI_DEPTH_GENERATOR + CAP_PROP_OPENNI_BASELINE
    • CAP_OPENNI_DEPTH_GENERATOR_FOCAL_LENGTH = CAP_OPENNI_DEPTH_GENERATOR + CAP_PROP_OPENNI_FOCAL_LENGTH
    • CAP_OPENNI_DEPTH_GENERATOR_REGISTRATION = CAP_OPENNI_DEPTH_GENERATOR + CAP_PROP_OPENNI_REGISTRATION

有關更多資訊,請參閱 videocapture_openni.cpp 在 opencv/samples/cpp 資料夾中的用法示例。