2017-01-03 3 views
1

少なくとも60HzのRPiを使用して画像をキャプチャするのが好きです。私のコードはC++であり、私たちはC++インターフェイスのライブラリhereを持っています。しかし、そのライブラリは最大30Hzです。 ターゲットは最低60 Hzです。 今まで私が見つけたのはraspistillですので、私はC++プログラムとraspistillコードをインターフェースしようとしています。 ここでは、ラスペistllへの直接インタフェースを持つ1つのライブラリPiCamが見つかりました。確かに、それは60Hzに行くことができる、私はまだそれをテストしようとしているいくつかの問題がある。 私のクエリはC++プログラムのraspistillを使用してカメラ画像を読む

(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

私はラズベリーPi3にhereRaspicamを使用し、白黒モードで約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×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に設定し、今は動作します。

関連する問題