消除Python OpenCV显示摄像头画面的延迟

这篇具有很好参考价值的文章主要介绍了消除Python OpenCV显示摄像头画面的延迟。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 问题描述

用 Python 通过 OpenCV显示摄像头画面时,如果对视频帧进行一些处理,常常会遇到一个问题,显示的画面比眼睛看到真实场景慢几秒甚至更多,给用户的体验不好。
消除Python OpenCV显示摄像头画面的延迟

画面延迟与卡顿的区别
卡顿是指视频播放时,出现一顿一顿的现象,不流畅,通常每秒播放速率少于10帧就可以感受到。 延迟是显示的画面比实际的场景慢了一段时间,不同步,但可能是流畅的。摄像头画面出现卡顿,通常也会造成延迟。

关于画面卡顿的原因及解决方案,不是本文讨论范围,但本人另1篇文章可能对此有帮助, 可参阅 用Numba加速OpenCV Python视频处理代码,提升6.5倍性能

2. 画面延迟原因

在视频处理应用程序中,由于对图像帧进行处理,通常会消耗一些时间,而OpenCV低层读帧时有缓存队列,会保存未取出的图像,用 read()方法读出的,可能是缓存里的旧帧,不是摄像头当前的帧。缓存中的帧较多时,就出现了明显的延迟。

解决方法

自定义1个无缓存读视频的VideoCapture接口类,来代替OpenCV的VideoCapture类。
开发步骤:
1) 建立1个队列queue
2) 开启1个子线程, 实时读取摄像头视频帧,队列中总是保存最后一帧,删除旧帧。
3) 显示时,从新接口类的队列中读取帧。

实现代码

import cv2
import queue
import threading
import time

# 自定义无缓存读视频类
class VideoCapture:
    """Customized VideoCapture, always read latest frame """
    
    def __init__(self, camera_id):
        # "camera_id" is a int type id or string name
        self.cap = cv2.VideoCapture(camera_id)
        self.q = queue.Queue(maxsize=3)
        self.stop_threads = False    # to gracefully close sub-thread
        th = threading.Thread(target=self._reader)
        th.daemon = True             # 设置工作线程为后台运行
        th.start()

    # 实时读帧,只保存最后一帧
    def _reader(self):
        while not self.stop_threads:
            ret, frame = self.cap.read()
            if not ret:
                break
            if not self.q.empty():
                try:
                    self.q.get_nowait() 
                except queue.Empty:
                    pass
            self.q.put(frame)

    def read(self):
        return self.q.get()
    
    def terminate(self):
        self.stop_threads = True
        self.cap.release()

if __name__ == "__main__":        
    # 测试自定义VideoCapture类
    cap = VideoCapture(0)
    while True:
        frame = cap.read()
        time.sleep(0.05)   # 模拟耗时操作,单位:秒   
        cv2.imshow("frame", frame)
        if chr(cv2.waitKey(1)&255) == 'q':  # 按 q 退出
            cap.terminate()
            break

使用上述方式,即使对视频帧处理时间过长,出现卡顿,由于新类会将未处理的帧丢弃,总是读取摄像头当前帧,因此消除了延迟,画面还是实时的。

实际应用时,可在本例代码基础上,进行优化。文章来源地址https://www.toymoban.com/news/detail-508836.html

到了这里,关于消除Python OpenCV显示摄像头画面的延迟的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【Python】【OpenCV】Cameo项目(一)实时显示摄像头帧

    【Python】【OpenCV】Cameo项目(一)实时显示摄像头帧

    1、实时捕获并显示摄像头帧。 2、具备截图、保存视频和退出 三个功能键 。  要求存在文件:manager.py 和 cameo.py   两个类:CaptureManager、WindowManager   CaptureManager负责 摄像头帧的捕获 , 编解码得到实际帧 , 当前帧保存为图片 、 一段时间内的帧保存为视频 这四个核心功能

    2024年02月05日
    浏览(12)
  • 在Orangepi5开发板3588s使用opencv获取摄像头画面

    在Orangepi5开发板3588s使用opencv获取摄像头画面

    先感谢香橙派群的管理员耐心指导,经过不断的调试修改最后成功通过opencv调用mipi摄像头获取画面 就记录分享一下大概步骤希望大家少踩点坑!!!!!! 我用的固件系统是 ubuntu2022.0.4 固件是: Orangepi5_1.1.6_ubuntu_jammy_desktop_gnome_linux5 .10.110.img 想通过opencv获取画面得先安装

    2024年02月12日
    浏览(14)
  • python+opencv实现显示摄像头,截取相关图片,录取相关视频

    python+opencv实现显示摄像头,截取相关图片,录取相关视频

    实时显示摄像头图像 按下空格键,截取图片 按下tab键,开始录制摄像内容,再次按下,结束录制  按下Esc键,关闭窗口 截图:  可以添加函数来使图像的显示效果改变(边缘检测效果): 自行在对应的帧显示处调用:  

    2024年02月14日
    浏览(17)
  • openCV 多线程调用多个海康威视摄像头(避免画面不同步),进行人脸识别

    openCV 多线程调用多个海康威视摄像头(避免画面不同步),进行人脸识别

    1、创建多个线程来拉取不同的视频流,不使用多线程的话,所有的视频流就在排一个队,会出现画面不同步的情况 代码: 2、使用numpy将多个画面放在同一个frame中,图像就是矩阵,numpy是用来处理矩阵的类 代码:  进行人脸识别,网不好帧率太低

    2024年04月25日
    浏览(53)
  • ArmSoM-W3之RK3588安装Qt+opencv+采集摄像头画面

    ArmSoM-W3之RK3588安装Qt+opencv+采集摄像头画面

    [RK3588从入门到精通] 专栏总目录 场景:在RK3588上做qt开发工作 RK3588安装Qt+opencv+采集摄像头画面 硬件环境: ArmSoM-W3 RK3588开发板、MIPI-CSI摄像头( ArmSoM官方配件 ) 软件版本: OS:ArmSoM-W3 Debian11 QT:QT5.15.2(Qt Creator:4.11.0) OpenCV:3.4.14 RK3588开发板联网,确认好是否能访问网络

    2024年02月14日
    浏览(20)
  • OpenCV中读取、显示、保存摄像头视频讲解与实战(附Python源码)

    OpenCV中读取、显示、保存摄像头视频讲解与实战(附Python源码)

    需要源码请点赞关注收藏后评论区留言私信~~~ OpenCV不仅能够处理图像,还能够处理视频。视频是由大量的图像构成的,这些图像以固定的时间间隔从视频中获取。这样,就能够使用图像处理的方法对这些图像进行处理,进而达到处理视频的目的。要处理视频,需要先对视频进

    2024年02月05日
    浏览(13)
  • 【Python】【OpenCV】视频帧和摄像头帧操作 and 窗口显示

    一、读取写入视频文件   二、捕获摄像头帧 和视频的读取写入没有什么差异,都是需要先创建一个VideoCapture Object来操作,下述是细微差别: 3   Line:VideoCapture(0),其中 0 代表设备,还可以1,2,3 分别代表不同的摄像头(如果存在),也可以输入网络摄像头,直接替换成

    2024年02月05日
    浏览(12)
  • 解决OpenCV使用USB摄像头获取高分辨率视频低帧率、卡、果冻画面的问题

    最近制作移动设备,需要安置多个usb摄像头到电脑,踩了几个坑,记录一下解决方案。 不能使用分线器插多个usb摄像头,同一时间只能加载一个。 usb摄像头调高分辨率时,非常卡顿,视频画面像果冻一样,及不流畅 第二个情况具体描述: 摄像头支持1920*1080  60fps,opencv在

    2024年02月16日
    浏览(20)
  • [Python] pyqt6+opencv实现摄像头图像的实时读取并显示(完整源代码)

    [Python] pyqt6+opencv实现摄像头图像的实时读取并显示(完整源代码)

    本文将会介绍如何通过opencv来实时捕获摄像头的图像,并通过pyqt6进行图像视频呈现。 1. 通过opencv的VideoCapture类读取摄像头的每一帧图像,通过pyqt6的QLabel来显示图像 2. 根据获取的图像的宽和高大小以及QLabel的大小来动态调整最后输出的图像的宽和高 3. 调整窗体大小,动态调

    2024年01月24日
    浏览(68)
  • python_获取网络(大华)摄像头画面,并存储为图片和视频

    网络摄像头 USB摄像头

    2024年02月12日
    浏览(11)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包