PS3-Eye カメラを搭載した Ubuntu 12.10 で OpenCV 2.4.3.2 を使用すると、 1 秒あたり最大 60 フレーム(FPS)を超えるキャプチャができません。カメラ自体は最大 125 FPS を提供します。OpenCV でフレームレートを制限するものを知りたいです。だからここに私がこれまでにしたことがあります:
#include <sys/time.h>
#include <time.h>
#include <iostream> // for standard I/O
using cv;
using std;
long time_diff( const timespec &t1, const timespec &t2 ) {
return (long)(t2.tv_sec-t1.tv_sec)*1000000000 + (t2.tv_nsec-t1.tv_nsec);
}
int main(int argc, char *argv[]) {
VideoCapture cap(0); // open the default camera
cap.set(CV_CAP_PROP_EXPOSURE, 0);
cap.set(CV_CAP_PROP_FPS, 125);
cap.set(CV_CAP_PROP_FRAME_WIDTH, 320);
cap.set(CV_CAP_PROP_FRAME_HEIGHT, 240);
if(!cap.isOpened()) // check if we succeeded
return -1;
Mat frame;
timespec t_start, t_end;
for(int i=1;;++i) {
cap >> frame;
clock_gettime(CLOCK_REALTIME, &t_end);
if( i%20==0 )
std::cout << "FPS ~= " << time_diff(t_start, t_end) << std::endl;
clock_gettime(CLOCK_REALTIME, &t_start);
}
}
これにより、20 フレームごとのフレームレートが stdout に出力されます。PS3-Eye カメラのフレームレートを正しく設定できるように、ソースにパッチを適用する必要があったことに注意してください。
まず、フレームレートを 30 ( cap.set(CV_CAP_PROP_FPS, 30);
) に設定して、測定値が正しいことを確認します。次に、より高いフレームレートを使用すると、報告されるフレームレートは ~60 FPS に制限されます。
で完全な 120 FPS を取得できるため、USB は問題ではありませんguvcview
。
上記のコードを使用grab()
してretrieve()
次のように変更しました。
clock_gettime(ClOCK_REALTIME, &t_start);
cap->grab();
clock_gettime(ClOCK_REALTIME, &t_end);
cap->retrieve(frame);
ただし、フレームレートは再び 60 FPS に制限されます。
では、何がフレームレートを制限しているのか、どうすればわかりますか?