Opencv读取摄像头卡顿

Posted 月洋流

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Opencv读取摄像头卡顿相关的知识,希望对你有一定的参考价值。

                                      Opencv读取摄像头卡顿

开发环境:Win10系统,罗技HD1080p高清摄像头,UE4_21,VS2017

开发原理:多线程中通过OpenCV对摄像头进行高清采集(1920*1080),然后显示到UMG中。

遇到问题:在2k采集模式下,画面卡顿厉害。

 

猜想1:是不是卡在采集后的图像cv::Mat往UTexture2D*填入时的问题,毕竟1920*1080个像素的拷贝。

实践:减小采集分辨率(640*480),然后cv::resize到1920*1080,再拷贝到1920*1080的UTexture2D* 中

结果:视频非常流畅,那么可以断言,跟图像据拷贝到UTexture2D*中这一步,就没关系了

 

猜想2:是不是摄像头采集的问题。有大佬说了,很多摄像头,在高分辨率的情况下都不到15帧,以MJPG格式解码能达到30帧。

实践:这一步当然去网上搜刮了。

         原理篇参阅Jetson TX1开发笔记(六):V4L2+OpenCV3.1以MJPG格式读取USB摄像头图像并实时显示

         https://blog.csdn.net/c406495762/article/details/72732135

大致意思是这样的,该摄像头的YUV2输出格式只有一种640 x 480分辨率,而输出格式为MJPG有多种分辨率,如果想实现高清采集,需要通过MJPG格式进行采集。

那么,怎么设置采集模式呢?

毫无疑问,肯定在设置里面。看看网上大佬是怎么表演的吧。

     Python opencv 调用摄像头时设置以MJPG等编码格式获取视频

     https://blog.csdn.net/qq_38392644/article/details/85197264

(下面引用上篇博客,转C++实现)

使用opencv读取和设置摄像头或视频属性代码如下。 

cv::VideoCapture cap;
cap.set(proID, value)
cap.get(proID)

其中,propId 的值为 0 - 18,19个值并不是每个都可以进行修改,每个值对应的属性以及功能如下如下: 

参数功能/意义
CV_CAP_PROP_POS_MSEC0视频文件的当前位置(以毫秒为单位)或视频捕获时间戳
CV_CAP_PROP_POS_FRAMES1基于0的索引将被解码/捕获下一帧
CV_CAP_PROP_POS_AVI_RATIO2视频文件相对位置:0 - 电影的开始,电影的1 - 结束
CV_CAP_PROP_FRAME_WIDTH3视频里每一帧的宽
CV_CAP_PROP_FRAME_HEIGHT4视频里每一帧的高
CV_CAP_PROP_FPS5视频的帧速
CV_CAP_PROP_FOURCC64个字符表示的视频编码器格式
CV_CAP_PROP_FRAME_COUNT7视频的帧数
CV_CAP_PROP_FORMAT8byretrieve()返回的Mat对象的格式
CV_CAP_PROP_MODE9指示当前捕获模式的后端特定值
CV_CAP_PROP_BRIGHTNESS10图像的亮度(仅适用于相机)
CV_CAP_PROP_CONTRAST11图像对比度(仅适用于相机)
CV_CAP_PROP_SATURATION12图像的饱和度(仅适用于相机)
CV_CAP_PROP_HUE13图像的色相(仅适用于相机)
CV_CAP_PROP_GAIN14图像的增益(仅适用于相机)
CV_CAP_PROP_EXPOSURE15曝光(仅适用于相机)
CV_CAP_PROP_CONVERT_RGB16表示图像是否应转换为RGB的布尔标志
CV_CAP_PROP_WHITE_BALANCE17目前不支持
CV_CAP_PROP_RECTIFICATION18立体摄像机的整流标志(注意:只有当前支持DC1394 v 2.x后端)
//1.打开摄像机设备(默认第一个)
cv::VideoCapture cap= cv::VideoCapture(0);
//2.一定要先设置采集格式!!!
cap.set(CV_CAP_PROP_FOURCC, cv::VideoWriter::fourcc('M', 'J', 'P', 'G'));
//3.然后再设置高清采集分辨率
cap.set(CV_CAP_PROP_FRAME_WIDTH, 1920);
cap.set(CV_CAP_PROP_FRAME_HEIGHT, 1080);

结果:流畅地一笔,自己去感受

以上是关于Opencv读取摄像头卡顿的主要内容,如果未能解决你的问题,请参考以下文章

Python QT5 - 多进程 OpenCV 网络摄像头和 Requests.Get

opencv能读取视频~但是无法读取摄像头,显示只有一片黑~

求用opencv把摄像头读取的图像转换成矩阵形式的代码

求用opencv把摄像头读取的图像转换成矩阵形式的代码

如何opencv读取摄像头并保存每一帧图像?

如何opencv读取摄像头并保存每一帧图像