1. 程式人生 > >ZED stereo camera開發入門教程(2)

ZED stereo camera開發入門教程(2)

教程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()的狀態,這將告訴您是否沒有新的幀可用(取決於攝像機的幀率)或發生錯誤。
// Grab an image
if (zed.grab() == SUCCESS) {
	// A new image is available if grab() returns SUCCESS
}
抓取完成後,您可以獲得ZED SDK提供的所​​有資料。在本教程中,我們要檢索左影象及其時間戳。為此,我們使用the Camera::retrieveImage()和Camera::getCameraTimestamp()功能。
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中找到該樣本的完整原始碼,位於同一資料夾中