从网络摄像头快速提取帧:C++和OpenCV与Matlab

MST*_*TTm 5 c++ webcam matlab opencv image-processing

我一直在使用C++和OpenCV开发一个实时图像分析项目,需要从网络摄像头中提取帧.我试图以任何速度提取这些帧时遇到问题 - 目前我只能管理大约18 fps.这是我用来从网络摄像头中提取帧的简单代码:

#include "opencv2/highgui/highgui.hpp"
#include <iostream>
#include <ctime>

using namespace std;
using namespace cv;

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

    VideoCapture cap(0);
    if(!cap.isOpened()) return -1;
    namedWindow("video", CV_WINDOW_AUTOSIZE);

    clock_t start = clock();

    for (int i = 0; i < 101; ++i)
    {
        Mat frame;
        cap >> frame;
        imshow("video", frame);
        waitKey(1);
    }

    clock_t finish = clock();

    double time_elapsed = (finish - start) / 1000.0;
    double fps = 100 / time_elapsed;

    cout << "\n\nTIME: " << time_elapsed << "\n\nFPS: " << fps << "\n\n";

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我尝试了其他代码,但没有一个允许我以比18 fps更快的速度提取帧.我希望达到类似于我在Matlab中可以达到的速度40到50 fps(使用下面的代码):

vid = videoinput('winvideo', 1, 'MJPG_640x480');
triggerconfig(vid, 'manual');    
start(vid);

tic;

for k = 1:100;
    clc;
    disp(k);
    I = peekdata(vid, 1);
    imshow(I);
    drawnow;
end

toc;

close();
stop(vid);
delete(vid);
Run Code Online (Sandbox Code Playgroud)

我已经看过使用mex文件来加速我的C++项目并启用GPU/CUDA支持但是我遇到了一些硬件问题所以我看到是否有一种更简单的方法或者我当前代码中缺少的东西.

提前致谢!

编辑我刚刚对代码进行了性能分析,有一些棘手的问题:

VideoCapture cap(0);            10.5%
cap >> frame;                   36.8%
imshow("video", frame);         31.6%
Run Code Online (Sandbox Code Playgroud)

V. *_*nko 3

waitkey(1) 会减慢你的速度。您可以尝试在每次迭代(例如第十次迭代)上执行此操作。请参阅http://answers.opencv.org/question/52774/waitkey1-timing-issues-causing-frame-rate-slow-down-fix/

你计算FPS的方法相当糟糕。尝试
double time_elapsed = (finish - start) / CLOCKS_PER_SEC; 不保证 CLOCKS_PER_SEC == 1000