2016-12-08 82 views
1

私は1280 x 720 @ 60 fpsをサポートするウェブカメラを使用しています。私はKinovea(0.85.15、https://www.kinovea.org/)、1280×720 @ 60fpsのので、カメラの実行でウェブカメラを実行するとopencvでカメラfpsを設定するには?

マイコンピュータ環境は、Intel i5-4690KとのWindows7、Visual Studioの2015年、OpenCVの3.1

です。

しかし、OpencvのVisualスタジオでは、@ 60 fpsでは動作しません。

ちょうど12~15 fpsで動作します。

カメラのfpsを確認するためのコードは以下のとおりです。

#include <stack> 
#include <iostream> 
#include <math.h> 
#include "opencv2/highgui/highgui.hpp" 
#include "opencv2/imgproc/imgproc.hpp" 
#include "opencv2/videoio.hpp" 
#include <opencv2/video.hpp> 
#include "opencv2/imgcodecs.hpp" 
#include <time.h> 



using namespace cv; 
using namespace std; 


int keyboard; 


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

    VideoCapture cap(0); //capture the video from web cam 

    if (!cap.isOpened()) // if not success, exit program 
    { 
     cout << "Cannot open the web cam" << endl; 
     return -1; 
    } 
    cap.set(CV_CAP_PROP_FRAME_WIDTH, 1280); 
    cap.set(CV_CAP_PROP_FRAME_HEIGHT, 720); 

    while ((char)keyboard != 'q' && (char)keyboard != 27) 

    { 
     Mat imgOriginal; 
     Mat ROOI; 

     clock_t a = clock(); 
     bool bSuccess = cap.read(imgOriginal); 

     if (!bSuccess) 
     { 
      cout << "Cannot read a frame from video stream" << endl; 
      break; 
     } 
     printf("Captue Time : %f\n", double(clock() - a)/double(CLOCKS_PER_SEC)); 

     imshow("Original", imgOriginal); 

     if (waitKey(1) == 27) 
     { 
      cout << "esc key is pressed by user" << endl; 
      break; 
     } 
    } 

    return 0; 

} 

上記のコードでは、私は "キャプチャ時間"をチェックし、それは通常0.07秒〜0.09秒を記録していました。

私はVideoCapture :: set(CV_CAP_PROP_FPS、60)を試みますが、動作しません。 (コードVideoCapture :: get(CV_CAP_PROP_FPS)を使用してFPSを取得すると、値0が返されます)。

ウェブカメラのFPSを制御するにはどうすればよいですか?

ありがとうございました。

+0

このスレッドはお持ちですか? (http://stackoverflow.com/questions/19662193/opencv-videocapturegetcv-cap-prop-fps-returns-0-fps) - ウェブカメラには一般的に、変更できない固定のフレームレートがあります。 – Dai

+0

@Daiご返信ありがとうございます。しかし、Webカメラに固定されたフレームレートがある場合は、Kinoveaプログラムで60 fpsの動作がわかりません。 Kinoveaとopencvの違いは何ですか?ありがとう。 –

+0

カメラがさまざまな入力レベルをサポートしているかどうかによって大きく異なります。私はOpenCV + OpenNIがVideeCapture(Kinectと連携して動作する)を設定する方法の例を挙げることができます: 'modeRes = m_capture.set(CAP_OPENNI_IMAGE_GENERATOR_OUTPUT_MODE、X);'、 'X'はその場合、' {CAP_OPENNI_VGA_30HZ、CAP_OPENNI_SXGA_15HZ 、CAP_OPENNI_SXGA_30HZ} '。私は、OpenNIが解像度設定内でそれをエンコードすると思います。 – hauron

答えて

0

OpenCVの外でカメラのフレームレートを設定してみてください。 Linuxでは、特にlibwebcam、およびuvcdynctrlを使用してUVCカメラ(Logitechなど)を制御できます。

+0

返信ありがとうございます。 libwebcamとuvcdynctrlがウェブカメラのfpsを制御できるのだろうか?今、私はLinuxで "Video4Linuxコントロールパネル"を使用しています。私はVideo4Linux上で明るさ、露出などをコントロールすることができますが、コントロールウェブカメラのfpsをサポートしていません。彼らはお元気ですか?ありがとう。 –

+0

一部のカメラでは、異なるfpsをサポートしていない可能性があります。@Daiが上記のコメントを指していました。 – szym

+0

ご返信ありがとうございます。カメラが60 fpsをサポートするという問題がありますが、opencvでは60 fpsで動作しません。問題は、カメラの接続方法です。私のカメラはMJPGを60 fps以上サポートしています。上記のコードをデバッグすると、カメラはYUY2で動作します。そこで、以下のようなコードを追加します。 'cap.set(CV_CAP_PROP_FOURCC、CV_FOURCC(' M '、' J '、' P '、' G '));' 'cap.set(CV_CAP_PROP_FRAME_WIDTH、1280);'そして、それは60fpsでうまく動作します。ありがとう! –

0

私のコードを以下のように変更すると、@ 60 fpsで動作します。

#include <stack> 
#include <iostream> 
#include <math.h> 
#include "opencv2/highgui/highgui.hpp" 
#include "opencv2/imgproc/imgproc.hpp" 
#include "opencv2/videoio.hpp" 
#include <opencv2/video.hpp> 
#include "opencv2/imgcodecs.hpp" 
#include <time.h> 



using namespace cv; 
using namespace std; 


int keyboard; 


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

    VideoCapture cap(0); //capture the video from web cam 

    if (!cap.isOpened()) // if not success, exit program 
    { 
     cout << "Cannot open the web cam" << endl; 
     return -1; 
    } 
    cap.set(CV_CAP_PROP_FOURCC, CV_FOURCC('M', 'J', 'P', 'G')); 
    cap.set(CV_CAP_PROP_FRAME_WIDTH, 1280); 
    cap.set(CV_CAP_PROP_FRAME_HEIGHT, 720); 

    while ((char)keyboard != 'q' && (char)keyboard != 27) 

    { 
     Mat imgOriginal; 
     Mat ROOI; 

     clock_t a = clock(); 
     bool bSuccess = cap.read(imgOriginal); 

     if (!bSuccess) 
     { 
      cout << "Cannot read a frame from video stream" << endl; 
      break; 
     } 
     printf("Captue Time : %f\n", double(clock() - a)/double(CLOCKS_PER_SEC)); 

     imshow("Original", imgOriginal); 

     if (waitKey(1) == 27) 
     { 
      cout << "esc key is pressed by user" << endl; 
      break; 
     } 
    } 

    return 0; 

} 

60 fpsの@働いカメラのキーは

cap.set(CV_CAP_PROP_FOURCC, CV_FOURCC('M', 'J', 'P', 'G')); 

私のカメラは、MJPGモードで60 fpsの@作品です。だから私は上記のコードを追加、それは正常に動作します!

+0

USB 2.0の制限に遭わないためには、カメラがM-JPEGに切り替える必要があります。これはあなたのカメラのための唯一の解決策であり、たとえそのカメラが60FPSをサポートしていても、別のカメラを持っている人を助けません。また、 'CV_CAP_PROP_FPS' _sometimes_ works ... –

関連する問題