Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.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

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++ OpenCV 4.5.2需要很长时间(>;100ms)才能从网络摄像头中检索单个帧,C++;在Windows 10上_C++_Opencv_Ffmpeg - Fatal编程技术网

C++ OpenCV 4.5.2需要很长时间(>;100ms)才能从网络摄像头中检索单个帧,C++;在Windows 10上

C++ OpenCV 4.5.2需要很长时间(>;100ms)才能从网络摄像头中检索单个帧,C++;在Windows 10上,c++,opencv,ffmpeg,C++,Opencv,Ffmpeg,我一直很难让我的网络摄像头与opencv一起快速工作。帧的读取需要很长的时间(500帧的记录平均为124ms),我已经在三台不同的计算机(运行Windows 10)上使用logitech C922网络摄像头进行了尝试。我最近测试的机器有一台Ryzen93950X,内存32gbs;不缺乏力量 代码如下: cv::VideoCapture cap = cv::VideoCapture(m_cameraNum); // Check if camera opened successfully if (

我一直很难让我的网络摄像头与opencv一起快速工作。帧的读取需要很长的时间(500帧的记录平均为124ms),我已经在三台不同的计算机(运行Windows 10)上使用logitech C922网络摄像头进行了尝试。我最近测试的机器有一台Ryzen93950X,内存32gbs;不缺乏力量

代码如下:

cv::VideoCapture cap = cv::VideoCapture(m_cameraNum);

// Check if camera opened successfully
if (!cap.isOpened())
{
    m_logger->critical("Error opening video stream or file\n\r");
    return -1;
}

bool result = true;
result &= cap.set(cv::CAP_PROP_FRAME_WIDTH, 1280);
result &= cap.set(cv::CAP_PROP_FRAME_HEIGHT, 720);

bool ready = false;
std::vector<string> timeLog;
timeLog.reserve(50000);
int i = 0;

while (i < 500)
{
    auto start = std::chrono::system_clock::now();
    
    cv::Mat img;
    ready = cap.read(img);

    // If the frame is empty, break immediately
    if (!ready)
    {
        timeLog.push_back("continue");
        continue;
    }

    i++;
    auto end = std::chrono::system_clock::now();
    timeLog.push_back(std::to_string(std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count()));
}

for (auto& entry : timeLog)
    m_logger->info(entry);

cap.release();
return 0;
cv::VideoCapture=cv::VideoCapture(m_cameraNum);
//检查摄像头是否成功打开
如果(!cap.isOpened())
{
m_logger->critical(“打开视频流或文件时出错\n\r”);
返回-1;
}
布尔结果=真;
结果&=cap.set(cv::cap\u PROP\u FRAME\u WIDTH,1280);
结果&=cap.set(cv::cap\u PROP\u FRAME\u HEIGHT,720);
bool ready=false;
std::vector timeLog;
时间记录储备(50000);
int i=0;
而(i<500)
{
自动启动=标准::时钟::系统时钟::现在();
cv::Mat img;
就绪=上限读数(img);
//如果框架为空,请立即断开
如果(!准备就绪)
{
timeLog.推回(“继续”);
继续;
}
i++;
自动结束=标准::时钟::系统时钟::现在();
timeLog.push_back(std::to_string(std::chrono::duration_cast(end-start.count());
}
用于(自动输入:timeLog(&E)
m_记录器->信息(输入);
释放帽();
返回0;
请注意,我在执行结束时将经过的时间写入日志文件。调试和发布的平均时间是124ms,在运行了六次之后,没有一个“continue”实例

无论我使用USB 2或USB 3端口(相机是USB2),还是运行调试版本或发布版本,日志文件都会显示每帧110毫秒到130毫秒的时间。相机在其他应用程序中工作正常,OBS可以获得平滑的图像1080@30fps或720@60fps.

通过调试和大量的谷歌搜索,我了解了以下关于我的系统的内容:

  • 默认情况下选择的后端是DSHOW。还提供GStreamer和FFMPEG
  • DSHOW以某种方式使用FFMPEG(它需要FFMPEG dll),但我不能通过opencv直接使用FFMPEG。尝试使用cv::VideoCapture(m_cameraNum,cv::CAP_FFMPEG)总是失败。Opencv与FFMPEG的接口似乎只能打开视频文件
  • 几年前的微软,不确定这是否与我的问题有关
以下是我尝试过的修复程序的简短列表,大部分来自较旧的SO帖子:

  • 结果&=cap.set(cv::cap_PROP_FRAME_COUNT,30);//返回false,不执行任何操作
  • 结果&=cap.set(cv::cap_PROP_CONVERT_RGB,0);//返回true,不执行任何操作
  • 结果&=cap.set(cv::cap_PROP_MODE,cv::VideoWriter::fourcc('M','J','P','G'));//返回false,不执行任何操作
  • 从中设置注册表项将禁用新的Windows摄像头服务器
  • 从4.5.0更新到4.5.2,无变化
  • 要求设备管理器查找较新的驱动程序,但未找到较新的驱动程序

我没有主意了。有什么帮助吗?

如果不设置高度和宽度,会发生什么情况。您可以删除这些行并重试吗?您还可以尝试输出
intfps=cap.get(CV\u cap\u PROP\u FPS)我想这就是这个问题的答案。@YunusTemurlenk,FPS的值是0。如果我不设置宽度和高度,那么视频流默认为640 x 480,检索每个帧的时间大约为30毫秒,这仍然太高。您可以查看我提到的链接。即使您的相机能够达到60 fps,后端有时也不支持,因为您看到的是0 fps,这是不可能的。可能是因为相机处于低光模式。它们有时会降低帧速率以减少噪音。你应该打开房间里的灯。