前一篇教程: 使用 OpenCV 建立影片
下一篇教程: 使用 Orbbec Astra 3D 相機
VideoCapture 類支援與 OpenNI 相容的深度感測器(Kinect、XtionPRO 等)。可以使用熟悉的 VideoCapture 介面檢索深度圖、BGR 影像和其他格式的輸出。
為了在 OpenCV 中使用深度感測器,您應該執行以下初步步驟
- 安裝 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。
- 透過在 CMake 中設定 WITH_OPENNI 標誌來配置 OpenCV 對 OpenNI 的支援。如果在安裝資料夾中找到 OpenNI,OpenCV 將使用 OpenNI 庫構建(請參閱 CMake 日誌中的 OpenNI 狀態),而 PrimeSensor Modules 可能無法找到(請參閱 CMake 日誌中的 OpenNI PrimeSensor Modules 狀態)。如果沒有 PrimeSensor 模組,OpenCV 將成功編譯 OpenNI 庫,但 VideoCapture 物件將無法從 Kinect 感測器獲取資料。
- 構建 OpenCV。
VideoCapture 可以檢索以下資料
- 來自深度生成器的資料
- 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)
- 來自 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);
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;
指定所需生成器型別的標誌必須與特定的生成器屬性組合使用。支援以下透過 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_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 資料夾中的用法示例。