c ++ cv :: videoCapture为高分辨率图像和运动模糊提供低fps

时间:2017-12-26 10:31:30

标签: c++ opencv video-capture

我希望获得20 fps的高分辨率图像流,这是我的代码(https://gist.github.com/imrasp/7622ac73a05b567dd52b43ea3dd84879)用于相机捕捉部分。我创建了一个单独的线程来读取帧并使用videoCapture setting设置大小,如下所示

 stream1 >> matFrameForward;
 stream1.set(CV_CAP_PROP_FRAME_WIDTH,  1280);
 stream1.set(CV_CAP_PROP_FRAME_HEIGHT, 720);

对于这个分辨率,我只有1 fps,而640x480的实验给出了25fps。我也尝试使用stream1.set(CV_CAP_PROP_FPS, 20);,但fps不会改变。我使用Mobius相机进行以下设置:

  • 网络摄像头模式:MJPG
  • 录音:关闭
  • 视频时间戳:关闭
  • 视频数据速率:低
  • 宽动态范围:弱光
  • 视野:宽
  • 视频分辨率:1280x720(720p)
  • 视频帧率:30 fps

关闭音频和时间戳稍微增加fps(从0.9到1.1)。目前,我通过计算10秒记录时间的接收帧数来检查fps。 此方法可以检查fps吗?如何使用c ++和openCV增加fps 2.4.11

移动相机时我也遇到了运动模糊。因为我研究到目前为止这些原因来自

  • 光线较弱的环境,较亮的场景会缩短曝光时间 提高锐度。
  • 高图像分辨率。
  • VideoCapture's settting

如何为此问题配置VideoCapture设置,除了上述原因之外,相机还没有自动对焦的模糊运动。

我的抓斗功能

void cameraLoop(){
    while (!time_to_exit) {
        timestampcamera_ns = boost::lexical_cast<uint64_t>(std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::system_clock::now().time_since_epoch()).count());

        pthread_mutex_lock(&_mutexFrameCam1Last);
        stream1 >> matFrameForward;
        stream1.set(CV_CAP_PROP_FRAME_WIDTH,  1280);
        stream1.set(CV_CAP_PROP_FRAME_HEIGHT, 720);
        // stream1.set(CV_CAP_PROP_BUFFERSIZE, 3);
        // stream1.set(CV_CAP_PROP_FPS, 20);

        pthread_mutex_unlock(&_mutexFrameCam1Last);

        std::cout << "read matFrameForward size : " << matFrameForward.size() << std::endl;
        cv::imshow("Camera", matFrameForward);
        if (cv::waitKey(30) >= 0)
            break;
    }
}

摄像机被声明为全局变量并在initializeParams()

中初始化
void initializeParams(){
    stream1 = cv::VideoCapture(1);
    ... // other parameters
}

我在main函数中使用boost thread declare创建了相机线程。

std::cout << "Start camera thread..." << std::endl;
boost::thread threadCamera = boost::thread(&cameraLoop);

0 个答案:

没有答案