라즈베리파이/라즈베리파이 일반

c++과 opencv를 이용하여 웹캠 영상 fps조정

아크리엑터 2023. 2. 6. 22:44
반응형

자동차에서 카메라를 연결하여 신호등 변화와 앞차가 이동하는 것을 감지하기 위해서, 1초에 1장~2장 정도를 찍을 수 있게 한다.

정지상태에서 앞차가 이동하거나 신호등 변화를 감지하려면, 초당 1~2 프레임 정도 속도면 충분하기 때문에 웹캠의 카메라 속도를 조절하려 한다.

opencv에서 아래의 코드로 카메라의 초당 frame 수를 지정할 수 있다고 한다.  cap.set(CAP_PROP_FPS, 2); 을 사용하면 될것 같은데... T.T

#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

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

  int fps = 2;

  VideoCapture cap(0);


  cap.set(CAP_PROP_FRAME_WIDTH, 640);
  cap.set(CAP_PROP_FRAME_HEIGHT, 480);
  cap.set(CAP_PROP_FPS, fps);

  if (!cap.isOpened()) {
    printf("Can't open the camera\n");
    return -1;
  }

  Mat img;

  while (1) {
    cap >> img;

    imshow("시험", img);

    if (waitKey(1) == 27) break;
  }

  return 0;
}

컴파일한 후에 실행을 했더니, 오류가 난다.

[ WARN:0@1.695] global /home/user/Downloads/workspace/opencv-4.6.0/modules/videoio/src/cap_gstreamer.cpp (1405) open OpenCV | GStreamer warning: Cannot query video position: status=0, value=-1, duration=-1
[ WARN:0@2.973] global /home/user/Downloads/workspace/opencv-4.6.0/modules/videoio/src/cap_gstreamer.cpp (2401) handleMessage OpenCV | GStreamer warning: Embedded video playback halted; module v4l2src0 reported: Internal data stream error.
[ WARN:0@2.974] global /home/user/Downloads/workspace/opencv-4.6.0/modules/videoio/src/cap_gstreamer.cpp (897) startPipeline OpenCV | GStreamer warning: unable to start pipeline
Can't open the camera
[ WARN:0@2.975] global /home/user/Downloads/workspace/opencv-4.6.0/modules/videoio/src/cap_gstreamer.cpp (862) isPipelinePlaying OpenCV | GStreamer warning: GStreamer: pipeline have not been created

cap.set(CAP_PROP_FPS, fps); 구문 때문에 오류가 나는데, 원인을 모르겠다. 그래서, 아래와 같이 수정해서 사용한다.

#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

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

  VideoCapture cap(0);

  cap.set(CAP_PROP_FRAME_WIDTH, 640);
  cap.set(CAP_PROP_FRAME_HEIGHT, 480);

  if (!cap.isOpened()) {
    printf("Can't open the camera\n");
    return -1;
  }

  Mat img;

  while (1) {
    cap >> img;

    if (waitKey(500) == 27) break;
  }

  return 0;
}

 

반응형