前提・実現したいこと
現在,Webカメラで指定したfpsで静止画像を撮影するプログラムを作成しております.
手動で経過時間を取得し,一定時間経過するたびに撮影を行うという方法を採用しております.
発生している問題・エラーメッセージ
カメラの画像撮影に必要以上に時間がかかっているようで,遅延によって願ったとおりのFPSで撮影できません.
このプログラムの目的は,20FPSでできるだけ誤差無く撮影できるようにしたいというものです.
もしかしたら,シャッター時間が長いのかもしれないと思ったのですが,OpenCVでシャッター時間を設定するにはどうしたらいいのでしょうか.
該当のソースコード
c++
1#include "main.h" 2 3int main(void) { 4 int fps = 10; //FPS指定 5 double spf = 1.0 / fps; 6 const int maxCount = 100; 7 int i; 8 int key; 9 10 LARGE_INTEGER freq; 11 LARGE_INTEGER start, now; 12 double time; 13 double count; 14 15 char name[256]; 16 17 cv::Mat frame; 18 cv::VideoCapture cap(0); 19 20 if (!cap.isOpened()) { 21 return -1; 22 } 23 24 cap.set(CV_CAP_PROP_FPS, 20); //何を設定しているんだろう? 25 cap.set(CV_CAP_PROP_FRAME_WIDTH, 640); 26 cap.set(CV_CAP_PROP_FRAME_HEIGHT, 480); 27 28 29 if (!QueryPerformanceFrequency(&freq)) { //経過時間の単位取得 30 return -1; //取得失敗 31 } 32 33 if (!QueryPerformanceCounter(&start)) { //初回経過時間取得 34 return -1; 35 } 36 37 count = 1.00; 38 while (1) { 39 if (!QueryPerformanceCounter(&now)) { //現在経過時間取得 40 return -1; 41 } 42 time = (double)(now.QuadPart - start.QuadPart) / freq.QuadPart; //経過時間算出 43 44 if (time >= count) { //count以上の時間が経過していた場合撮影を行う. 45 46 //printf("count = %f : %.3f : ", count,time); 47 48 cap >> frame; 49 if (!QueryPerformanceCounter(&now)) { 50 return -1; 51 } 52 time = (double)(now.QuadPart - start.QuadPart) / freq.QuadPart; //撮影後の経過時間算出 53 54 //printf("%.3f\n", time); 55 56 sprintf_s(name, "%.3f.jpg", time); 57 cv::imwrite(name, frame); 58 cv::imshow("Capture", frame); 59 count += spf; 60 } 61 62 key = cv::waitKey(1); 63 if (key == 0x1b) 64 break; 65 66 } 67 68 getchar(); 69 70 return 0; 71} 72
補足情報(FW/ツールのバージョンなど)
Windows10
VisualStudio2017
OpenCV 3.4.1
回答4件
あなたの回答
tips
プレビュー