Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;OpenCV,非常慢的read()FPS,在移动到OpenCV4之后_C++_Opencv_Frame Rate - Fatal编程技术网

C++ C++;OpenCV,非常慢的read()FPS,在移动到OpenCV4之后

C++ C++;OpenCV,非常慢的read()FPS,在移动到OpenCV4之后,c++,opencv,frame-rate,C++,Opencv,Frame Rate,所以目前我所做的只是重写使用C OpenCV(而不是even2)的旧方法。 它以1920x1080的速度以每秒30帧的速度运行。但在我进行重构时,我希望转移到最新的库 硬件是一样的,到目前为止,逻辑和一切都是一样的。除之前捕获帧外,我使用的是cvQueryFrame和cvCaptureFromCAM,目前它是: CameraController::CameraController(Config& config) : _config(config) { _cam = VideoC

所以目前我所做的只是重写使用C OpenCV(而不是even2)的旧方法。 它以1920x1080的速度以每秒30帧的速度运行。但在我进行重构时,我希望转移到最新的库

硬件是一样的,到目前为止,逻辑和一切都是一样的。除之前捕获帧外,我使用的是
cvQueryFrame
cvCaptureFromCAM
,目前它是:

CameraController::CameraController(Config& config) : _config(config)
{

    _cam = VideoCapture(0);
    _cam.set(CAP_PROP_FRAME_WIDTH, _config.get<int>("camWidth"));
    _cam.set(CAP_PROP_FRAME_HEIGHT, _config.get<int>("camHeight"));
    _cam.set(CAP_PROP_FPS, _config.get<int>("camFPS"));  //30 FPS, tried without it
    _cam.set(CAP_PROP_BUFFERSIZE, 2);  // tried without it 
}

void CameraController::capture()
{
    _cam.read(_frame);
}
CameraController::CameraController(配置和配置):\u Config(配置)
{
_cam=视频捕获(0);
_cam.set(CAP_PROP_FRAME_WIDTH,_config.get(“camWidth”);
_cam.set(CAP_PROP_FRAME_HEIGHT,_config.get(“camHeight”));
_cam.set(CAP_PROP_FPS,_config.get(“camFPS”);//30 FPS,尝试不使用它
_cam.set(CAP_PROP_BUFFERSIZE,2);//尝试不使用它
}
void CameraController::capture()
{
_凸轮读取(_帧);
}
我的线程运行方式如下:

ptime currentTime = microsec_clock::local_time();
        float deltaTime = (currentTime - m_prevTime).total_microseconds() / 1000000.0f; // to seconds
        if (deltaTime > 1)
            deltaTime = 0;

        //Capture frame
        _cam.capture();

// Reset timer match desired FPS
        m_loopTimer.expires_from_now(milliseconds((1/_config.get<int>("camFPS"))) * 1000); //to match desired fps (previously was 16ms and no difference)
        m_loopTimer.async_wait(boost::bind(&UpdateController::UpdateLoop, this));
        m_prevTime = currentTime;
ptime currentTime=microsec_clock::local_time();
float deltaTime=(currentTime-m_prevTime).total_microseconds()/1000000.0f;//到秒
如果(增量时间>1)
deltaTime=0;
//捕获帧
_cam.capture();
//重置计时器匹配所需FPS
m_loopTimer.expires_from_now(毫秒((1/_config.get(“camFPS”))*1000)//匹配所需fps(以前为16ms,无差异)
异步等待(boost::bind(&UpdateController::UpdateLoop,this));
m_prevTime=当前时间;
使用
1920x1080
我可以获得5-7fps的速度。以最低的分辨率,我可以得到30fps,但这不是我想要的。
为什么会发生这种情况?

花费的时间在哪里?你所说的时间是什么意思m_loopTimer.expires_from_now(毫秒((1/_config.get(“camFPS”)))*1000)`这是为了在问题出现后(如果是30fps,则在33ms后)重新运行更新。你不能睡觉/等待。VideoCapture::read必须经常运行以收集帧,这样帧就不会在驱动程序中排队。也可能存在这样的情况,视频捕获无法比您看到的更快,因为它隐式地进行颜色空间转换,并且这些转换需要时间。
expires\u from\u now
意味着您需要等待33毫秒,但这是在VideoCapture::read上花费的时间之外的。尝试0毫秒并精确检查您获得的帧速率,以及它与原始代码的差异。正确。它不是完全异步的。在read调用中可以进行一些颜色空间转换。如果存在排队的帧,它将使用该帧(并在需要时进行转换)。如果没有帧,它将等待摄影机创建帧。如果读取速度不够快,帧可以并且将在大多数驱动程序中排队。