介绍V4L2更新视频缓冲的方式、Qt paintEvent更新控件的基础上,实现如何实现视频的动态显示。

我们使用v4l2控制usb 摄像头,对摄像头的静态图片采集流程操作过程可以归纳为


图1 静态图片采集流程图

所用到的函数和参数都在旁边标注出。可以看到使用命令VIDIOC_DQBUF将缓存中的图像帧取出,然后摄像头设备是一直在采集图像,如果没有更新缓存区命令,采集到的新数据是不会被更新到缓存中的。v4l2提供了与VIDIOC_DQBUF命令相对的命令VIDIOC_QBUF,我对这个命令的理解就是允许摄像头设备将采集图像更新到缓存区。

假设开辟的缓存FIFO大小为4帧,如图2(a),当使用VIDIOC_DQBUF命令后,当前帧n从FIFO中取走,FIFO留下一个空缺,如图2(b),这种情况下如果使用VIDIOC_QBUF命令,新一帧n+4将被写入缓存,如图2©。


图2 缓存FIFO与VIDIOC_DQBUF命令、VIDIOC_QBUF命令

所以为了实现缓存区图像数据的动态更新,需要在每一次处理完数据后使用VIDIOC_QBUF更新缓存区,以便下一次VIDIOC_DQBUF获取到新的一帧数据。因而动态更新缓存的视频采集流程应该如图3所示:


为此,需要重新定义两个函数,一个我们定义为get_frame获取视频帧:

int VideoDevice::get_frame(void **frame_buf, size_t* len)
{v4l2_buffer queue_buf;queue_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;queue_buf.memory = V4L2_MEMORY_MMAP;if(ioctl(fd, VIDIOC_DQBUF, &queue_buf) == -1){return FALSE;}*frame_buf = buffers[queue_buf.index].start;*len = buffers[queue_buf.index].length;index = queue_buf.index;return TRUE;
}

再定义free_frame释放视频帧,让出缓存空间准备新的视频帧数据:

int VideoDevice::free_frame()
{if(index != -1){v4l2_buffer queue_buf;queue_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;queue_buf.memory = V4L2_MEMORY_MMAP;queue_buf.index = index;if(ioctl(fd, VIDIOC_QBUF, &queue_buf) == -1){return FALSE;}return TRUE;}return FALSE;
}

Qt的paintEvent事件

USB摄像头图片采集+QT显示里面,我们对采集的的视频帧数据的显示,采用的方法是使用了一个QLabel和QPixmap,并使用loadfromdata函数将采集的数据转为QPixmap中的数据,并显示到QLabel上。这样的做法导致的结果是QLabel和QPixmap数据只能被更新一次,所以只能显示静态图片。

在完成了视频缓存数据更新后,我们所面临的问题就是怎么样才能把这个数据动态显示出来。好在Qt提供了窗口刷新事件paintEvent,在这里,我们可以使用两种方式触发paintEvent事件:

1、使用定时器QTimer,定时为33ms(因为摄像头的帧频为30pfs);

2、不使用定时器,由QLabel自身内容改变产生。这里采用这种方式。paintEvent函数内容

void Widget::paintEvent(QPaintEvent *)
{rs = vd->get_frame((void **)&yuv_buffer,&len);convert_yuv_to_rgb_buffer(yuv_buffer,rgb_buffer,640,480);frame->loadFromData((uchar *)rgb_buffer,640 * 480 * 3);ui->label->setPixmap(QPixmap::fromImage(*frame,Qt::AutoColor));rs = vd->unget_frame();
}

【Webcam设计】视频的采集和动态显示相关推荐

  1. (原创)基于ZedBoard的Webcam设计(二):USB摄像头图片采集+QT显示

    在(原创基于ZedBoard的Webcam设计(一):Zedboard上的USB摄像头(V4L2接口)的图片采集中,我们完成了ZedBoard上USB摄像头的单幅图片采集,采集到的图片是存储在文件系统 ...

  2. 基于ZedBoard的Webcam设计(二):USB摄像头图片采集+QT显示

    在(原创基于ZedBoard的Webcam设计(一):Zedboard上的USB摄像头(V4L2接口)的图片采集中,我们完成了ZedBoard上USB摄像头的单幅图片采集,采集到的图片是存储在文件系统 ...

  3. 在线直播网站源码开发,视频的采集如何实现?

    支撑在线直播网站源码发展的关键就是直播技术的实现,在整个流媒体传输中视频的采集时开始,一般利用到的是设备端的摄像头,我们在实现视频采集时,不仅需要获取摄像头的调用权限,还要获取到视频录制的数据. 我们 ...

  4. AI:一个20年程序猿的学习资料大全—结构分析软件/办公软件/电气制造控制/高级语言编程/平面三维设计/视频编辑/FQ格式转换软件——只有你不想要的,没有你找不到的

    AI:一个20年程序猿的学习资料大全-结构分析软件/办公软件/电气制造控制/高级语言编程/平面三维设计/视频编辑/FQ格式转换软件--只有你不想要的,没有你找不到的 目录 (有偿提供,替朋友转载,扫描 ...

  5. android mediarecorder 输出到流_音视频的采集、编码、封包成 mp4 输出

    使用 Android Camera API 完成音视频的采集.编码.封包成 mp4 输出 基于android.hardware.Camera,创建一个横屏应用,实时预览摄像头图像,实现录像并输出MP4 ...

  6. js变量显示在html中_PythonDjango+JS+Ajax实现网页采集并动态显示PLC变量

    Python-snap7与S7-1500的通讯可以查阅前几篇.篇末演示功能实现的效果. 利用PythonDjango+JS+Ajax技术来实现:网页发送读写请求至服务器,服务器写入数据至PLC,并读取 ...

  7. 首个非逆向,不需要手机!的微信视频号采集方案

    历经劫难,终于搞定微信视频号采集方案 以下为视频号(环球时报)截止 2021 年 06-25 日上午 10.00 的数据 贴出部分截图

  8. 视频收集、视频征集、视频采集、征集视频、收集视频、采集视频工具/小程序

    有什么可以方便做视频收集.视频征集.视频采集.征集视频.收集视频.采集视频的工具或者小程序呢? 作为公众号运营者,一方面经常会组织一些活动,需要收集大家的活动视频:另一方面公众号有时候没有素材,需要向 ...

  9. 音频频谱显示-基于fmod设计音乐播放器并动态显示频谱图(二)

    音频频谱显示-显示音频文件静态频谱图(一) https://blog.csdn.net/xiaolong1126626497/article/details/126971535 音频频谱显示-基于fm ...

  10. 最牛ks短视频评论采集软件

    简介: 最牛ks视频评论采集软件可以帮助用户快速采集ks视频的评论,提供支持自定义采集视频评论,支持导出女或男,同时支持导出指定评论内容UID或抖音号,而且还可以自定义搜索指定用户,继而采集该用户作品 ...

最新文章

  1. 高压模块性相关的几个问题测量
  2. [转载]对 Linux 新手非常有用的20个命令
  3. 22. Generate Parentheses
  4. dat文件打开乱码_5.2 实战1:解决在Linux下打开Windows汉字文本的乱码问题
  5. 博文视点大讲堂36期——让Oracle跑得更快 成功举办
  6. Pytorch《LSTM模型》
  7. 怎么把一个网页作为背景套在另一个网页上_设计科技公司网站背景的六个小技巧...
  8. 使用Jstl异常:The absolute uri: http://java.sun.com/jsp/jstl/core cannotnbs
  9. 【TSP】基于matlab模拟退火算法求解31城市旅行商问题【含Matlab源码 1148期】
  10. iic标准c语言,I2C总线之(三)---以C语言理解IIC
  11. STM32通用和复用功能I/O(GPIO和AFIO) ADC DMA
  12. n位整数去掉m位后求最大值问题
  13. Markdown基操
  14. vscode 注释多行代码_如何在Visual Studio Code中注释多行?
  15. 《MLB美职棒大联盟》:世界大赛最有价值球员奖
  16. skipped: maximum number of running instances reached (1)
  17. Splay(dispatching)
  18. CSS空格和换行的处理
  19. EFS】NV65633-LTE搜网能力的NV值、格式、配置
  20. 10G数据,1G内存排序问题

热门文章

  1. HTML学习总结(2)——标题/水平线/注释/段落/折行/文本格式化
  2. Python 3.65 pip升级出现ModuleNotFoundError: No module named 'pip'问题
  3. 【ENVI预处理】辐射校正、影像配准、图像融合、图像镶嵌 、图像裁剪、图像增强
  4. mysql创建用并 grant_Mysql创建用户并授权
  5. Flutter实战之Image和FadeInImage
  6. Android自定义 view之图片裁剪从设计到实现
  7. 大学mysql期末试题_大学期末考试综合实训试题一
  8. Flink SQL 系列 | 5 个 TableEnvironment 我该用哪个?
  9. js ajax mysql_Ajax与mysql数据交互实现留言板功能
  10. window location href 手机端无法跳转_JavaScriptBOM__History_location(二十)