ZED stereo camera開發入門教程(2)
阿新 • • 發佈:2019-02-20
教程2:影象捕獲
本教程將介紹如何捕獲ZED攝像機的左影象。程式將迴圈,直到我們成功地抓住了50張影象。我們假設您已閱讀教程1併成功打開了ZED。
入門
- 首先,在stereolabs.com上下載最新版本的ZED SDK 。
- 有關更多資訊,請閱讀ZED API文件。
先決條件
- Windows 7 64位或更高版本,Ubuntu 16.04
- ZED SDK及其依賴項(CUDA)
構建程式
構建Windows
- 在原始檔夾中建立一個“build”資料夾
- 開啟cmake-gui並選擇源和構建資料夾
- 生成Visual Studio Win64解決方案
- 開啟生成的解決方案並將配置更改為 Release
- 構建解決方案
構建Linux
在示例目錄中開啟一個終端,並執行以下命令:
mkdir build
cd build
cmake ..
make
程式碼概述
建立一個相機
與上一個教程一樣,我們建立,配置和開啟ZED。我們在這裡展示如何設定解析度和幀率。我們希望在這個例子中以30 fps(預設)在H1080中工作。// Create a ZED camera object Camera zed; // Set configuration parameters InitParameters init_params; init_params.camera_resolution = RESOLUTION_HD1080; // Use HD1080 video mode init_params.camera_fps = 30; // Set fps at 30 // Open the camera ERROR_CODE err = zed.open(init_params); if (err != SUCCESS) exit(-1);
捕獲資料
現在ZED打開了,我們現在可以捕捉到它的影象。我們建立一個捕獲50個影象並退出的迴圈。要捕獲影象並進行處理,您需要呼叫Camera :: grab()函式。此函式也具有執行時引數,但在本教程中我們將其保留為預設值。每次你想要一個新的影象,你需要呼叫這個功能。如果grab()返回SUCCESS,則新的影象已被捕獲,現在可用。否則,您可以檢查grab()的狀態,這將告訴您是否沒有新的幀可用(取決於攝像機的幀率)或發生錯誤。
抓取完成後,您可以獲得ZED SDK提供的所有資料。在本教程中,我們要檢索左影象及其時間戳。為此,我們使用the Camera::retrieveImage()和Camera::getCameraTimestamp()功能。// Grab an image if (zed.grab() == SUCCESS) { // A new image is available if grab() returns SUCCESS }
zed.retrieveImage(image,VIEW_LEFT); // Get the left image
unsigned long long timestamp = zed.getCameraTimestamp(); // Get the timestamp of the image
printf("Image resolution: %d x %d || Image timestamp: %llu\n", image.getWidth(), image.getHeight(), timestamp);
retrieveImage()取一個sl :: Mat作為引數,還有一個VIEW模式。我們首先需要在啟動迴圈之前建立Mat。請注意,建立Mat不會分配其記憶體,因此第一個retrieveImage()將為我們自動分配其記憶體。由於我們想要在捕獲50張影象時停止迴圈,所以當抓取成功時,我們只會增加計數器。
// Capture 50 frames and stop
int i = 0;
sl::Mat image;
while (i < 50) {
// Grab an image
if (zed.grab() == SUCCESS) {
// A new image is available if grab() returns SUCCESS
zed.retrieveImage(image, VIEW_LEFT); // Get the left image
unsigned long long timestamp = zed.getCameraTimestamp(); // Get the timestamp at the time the image was captured
printf("Image resolution: %d x %d || Image timestamp: %llu\n", image.getWidth(), image.getHeight(), timestamp);
i++;
}
}
注意:影象時間戳以納秒為單位給出。您可以比較兩個grab()之間的時間戳:它應該接近幀速率時間,如果沒有丟幀。
現在我們拍攝了50張影象,我們可以關閉相機並退出程式。
// Close the camera
zed.close();
return 0;
這就是它!現在您可以轉到下一個教程,瞭解如何從ZED攝像機獲得深度。
您可以在main.cpp中找到該樣本的完整原始碼,位於同一資料夾中