私はOpenCVを使用してC++でプログラムを実行しています。このプログラムは、カメラの画像を読み取ってから、いくつかの処理を実行します。できるだけ速く動かすだけで、カメラは15FPSで動作します。カメラを使用して、FPSを10FPSなどの選択した数に調整しようとしています。これを行うためにタイマーを使用しています(timespecオブジェクトとclock_gettime()関数呼び出し)。時計自体は正常に動作し、カメラも正常に動作しますが、100ミリ秒ごとに自分でフレームを取得しようとすると、プログラムは約3秒間実行され、その後完全にフリーズします。これは私のコードのwhileループです:
/* Start the timer */
clock_gettime(CLOCK_REALTIME, &ts);
startBit = ts.tv_nsec;
/* Show the image captured from the camera in the window and repeat */
while (1) { // main while loop
clock_gettime(CLOCK_REALTIME, &ts);
endBit = ts.tv_nsec;
if (endBit-startBit >= 100000000) { // > 100 ms
fprintf(stderr, "%lu\n", endBit-startBit);
clock_gettime(CLOCK_REALTIME, &ts);
startBit = ts.tv_nsec; // reset timer
IplImage* frame = cvQueryFrame(capture); // Get one frame
Mat limage(frame); // convert IplImage to Mat
if (!frame) {
fprintf(stderr, "ERROR: frame is null...\n");
getchar();
break;
}
cvWaitKey(90);
}
}
プログラムは、経過した時間をコンソールに出力します。現在の設定方法では、常に100ミリ秒(100000000 ns)に近い値を出力する必要があります。しかし、コンソールは1秒に1回、奇妙な数値を示します:18446744072800674356。前述のように、カメラの画像コードをコメントアウトすると、タイマーはそれ自体で正常に動作します(それでもその膨大な数値を出力しますが、永久に実行されます)。また、タイマーコードをコメントアウトすると、カメラは15FPSで問題なく動作します。ただし、コードを一緒に実行すると、約3秒後にフリーズします。どんな助けでも大歓迎です!