2017-01-03 220 views
1

我喜歡用RPi至少60Hz捕捉圖像。我的代碼是用C++編寫的,我們有一個用於C++接口的庫here。但是這個庫的最大頻率是30Hz。 我的目標是最低60赫茲。 到目前爲止我發現的是raspistill可以達到90Hz,所以我試圖將我的C++程序連接到raspistill代碼。 我在這裏找到了一個庫PiCam,它與raspistll具有直接接口。不是很確定,它可以達到60Hz,我仍然試圖測試它,並有幾個問題。 我的查詢是使用raspistill從C++程序讀取攝像頭圖像

(1)如何使用C++在RPi上使用60Hz fps? (2)爲了連接到PiCam,我已經編譯,構建並安裝了這個庫,沒有任何問題。 但是當我捕捉時我會看到黑色的圖像。可能是什麼問題?我的代碼的一部分如下所示。

CCamera* cam = StartCamera(640, 480,60,1,true); 
    char mybuffer[640 * 480 * 4]; 
    int ret = cam->ReadFrame(0, mybuffer, sizeof(mybuffer)); 
    cout << " ret " << ret << endl; 
    Mat img(480, 640, CV_8UC4,mybuffer); 
    imwrite("img.jpg", img); 

img.jpg被黑色圖像捕獲。

(3)使用PiCam,我該如何更改爲灰度圖像?

回答

2

我使用Raspicamhere在Raspberry Pi 3上,並在黑白模式下獲得90 fps左右。

我目前正在重新定位其他東西的代碼,所以它不是100%完美的滿足您的需求,但應該讓您繼續。

#include <ctime> 
#include <fstream> 
#include <iostream> 
#include <raspicam/raspicam.h> 
#include <unistd.h> // for usleep() 

using namespace std; 

#define NFRAMES 1000 
#define WIDTH 1280 
#define HEIGHT 960 

int main (int argc,char **argv) { 

    raspicam::RaspiCam Camera; 
    // Allowable values: RASPICAM_FORMAT_GRAY,RASPICAM_FORMAT_RGB,RASPICAM_FORMAT_BGR,RASPICAM_FORMAT_YUV420 
    Camera.setFormat(raspicam::RASPICAM_FORMAT_GRAY); 

    // Allowable widths: 320, 640, 1280 
    // Allowable heights: 240, 480, 960 
    // setCaptureSize(width,height) 
    Camera.setCaptureSize(WIDTH,HEIGHT); 

    // Open camera 
    cout<<"Opening Camera..."<<endl; 
    if (!Camera.open()) {cerr<<"Error opening camera"<<endl;return -1;} 

    // Wait until camera stabilizes 
    cout<<"Sleeping for 3 secs"<<endl; 
    usleep(3000000); 
    cout << "Grabbing " << NFRAMES << " frames" << endl; 

    // Allocate memory for camera buffer 
    unsigned long bytes=Camera.getImageBufferSize(); 
    cout << "Width: " << Camera.getWidth() << endl; 
    cout << "Height: " << Camera.getHeight() << endl; 
    cout << "ImageBufferSize: " << bytes << endl;; 
    unsigned char *data=new unsigned char[bytes]; 

    for(int frame=0;frame<NFRAMES;frame++){ 
     // Capture frame 
     Camera.grab(); 

     // Extract the image 
     Camera.retrieve (data,raspicam::RASPICAM_FORMAT_IGNORE); 
     } 
    } 
    return 0; 
} 

順便說一句,它工作得很好地與CImg

此外,我還沒有時間來看看它是否能更快地創建一個新的線程來處理每一幀,或者有一些線程在開始時啓動,並使用條件變量在獲取之後啓動一個線程每一幀。

+0

是的,目前我使用的庫,它有30Hz幀率最大。你有沒有測試過90Hz fps?沒有設置fps的配置。我的圖像處理大約需要10ms,所以如果我從文件中讀取圖像,我可以達到100Hz。但我使用該庫的640 x 480幀大小,我可以有30Hz的最大值。所以從相機讀取對我來說是瓶頸。如何使用lbrary設置更高的fps? – batuman

+0

我可以讀取90+ fps。我不設定比率,我只是儘可能快地閱讀相框。嘗試讀取1,000幀並測量時間 - 然後減去3秒的穩定時間。我大約14秒。 –

+0

謝謝我將執行線程,拆分圖像讀取線程和處理線程。 – batuman

0

Mark Setchell回答的是正確的。

但是我發現設置幀速率參數沒有暴露在它的API級別並且不能設置幀速率。默認幀速率爲30 Hz。 可以在src/private/private_impl.cpp文件中更改它。我設置爲60Hz,現在它工作。