当前位置: 首页 > 编程日记 > 正文

python视频延迟严重_【Python】改善 VideoCapture 的影像延迟

许多的范例程序大多仅介绍该如何用 VideoCapture 撷取摄影机的画面,却没有充分说明其隐含的问题。

以下示范一个最基本的影像撷取程序。

# -*- coding: utf-8 -*-

import cv2

# ip camera 的撷取路径

URL = "rtsp://admin:admin@192.168.1.1/video.h264"

# 建立 VideoCapture 对象

ipcam = cv2.VideoCapture(URL)

# 使用无穷循环撷取影像,直到按下Esc键结束

while True:

# 使用 read 方法取回影像

stat, I = ipcam.read()

# 加上一些影像处理...

# imshow 和 waitkey 需搭配使用才能展示影像

cv2.imshow('Image', I)

if cv2.waitKey(1) == 27:

ipcam.release()

cv2.destroyAllWindows()

break

一般而言,都是这样写的。

先取回一帧影像,然后进行处理,膨胀闭合之类的,再使用CNN来辨识一下...等等。

全部都处理完了,再继续截取下一帧影像。

这种范例程序占了90%的google版面。

当然了,那个趴数是夏恩胡诌的,这边只是想表示 "很多" 的意思。

这种写法有什么问题呢?

其实只要稍微改动一下上述的程序,就可以看出来。

我们把 cv2.waitkey(1) 改成 cv2.waitkey(1000),意思是程序到这边等待 1 秒。

在实际上的情况,我们不会直接使用waitkey(1000),

而是每一次循环内影像处理的流程费时 1 秒,也许会快一些或是慢一些。

然后我们就会发现一件事:怎么影像不动了?或是影像怎么会延迟?

尤其是影像上面如果有日期时间的话,就更明显的看到秒数连动都不会动。

明明已经过了10秒钟,取回10张影像,但是影像显示的时间却没有任何改变?

原因是因为VideoCapture会把从摄影机取回来的影像先放到缓冲区,等待使用者将缓冲区内的影像取走,再填充新的影像进去。

如果摄影机的拍摄频率是一秒10帧影像(10fps),但我们一秒只读取一张,

那就表示我们会一直读取到同一时刻的影像,直到把缓冲区清空为止,

又缓冲区有多少帧影像,则是取决于摄影机设定的拍摄频率。

也因此在不明所以的人眼中看起来的问题就是:

为什么怎么我的影像串流会出现延迟的问题?

而这个问题最根本的原因是:

从缓冲区取出影像的速度,低于填入影像的速度!

要解决这个问题的方法有两个:

一、降低摄影机的拍摄速度

摄影机都可以手动调整撷取影像的频率,既然程序无法消耗这么多帧影像,那就把摄影机的频率降低。

那如果是即时影像辨识,非要这么快的速度不可,

例如在门口的人脸辨识系统,速度太慢的可能会被主管电到飞上天。

这时候就可以考虑使用多线程的技巧。

二、多线程

将撷取影像的循环单独放进一个线程,使其不断地清空缓冲区,保留最新的影像。

另外在主程序的部分就是有需要的时候再将最新的影像取回来。

所以把上面的那支程序改成以下这样:

# -*- coding: utf-8 -*-

import cv2

import time

import threading

# 接收摄影机串流影像,采用多线程的方式,降低缓冲区栈图帧的问题。

class ipcamCapture:

def __init__(self, URL):

self.Frame = []

self.status = False

self.isstop = False

# 摄影机连接。

self.capture = cv2.VideoCapture(URL)

def start(self):

# 把程序放进子线程,daemon=True 表示该线程会随着主线程关闭而关闭。

print('ipcam started!')

threading.Thread(target=self.queryframe, daemon=True, args=()).start()

def stop(self):

# 记得要设计停止无限循环的开关。

self.isstop = True

print('ipcam stopped!')

def getframe(self):

# 当有需要影像时,再回传最新的影像。

return self.Frame

def queryframe(self):

while (not self.isstop):

self.status, self.Frame = self.capture.read()

self.capture.release()

URL = "rtsp://admin:admin@192.168.1.1/video.h264"

# 连接摄影机

ipcam = ipcamCapture(URL)

# 启动子线程

ipcam.start()

# 暂停1秒,确保影像已经填充

time.sleep(1)

# 使用无穷循环撷取影像,直到按下Esc键结束

while True:

# 使用 getframe 取得最新的影像

I = ipcam.getframe()

cv2.imshow('Image', I)

if cv2.waitKey(1000) == 27:

cv2.destroyAllWindows()

ipcam.stop()

break

以上两个建议,是夏恩觉得比较容易解决问题的方法。

若您也遇到相同的问题,请随意参考。

相关文章:

CentOS 6.0配置pptp ××× Client和Squid透明网关

目的: 构建一台单网卡Linux网关(透明代理),该网关拨入某海外服务器,客户端设定该网关后,网络出口则为海外服务器,实现加速访问一些网站的目的。 环境信息: 硬件:DELL机器…

mysql汉字转拼音函数

-- 创建汉字拼音对照临时表 CREATE TABLE IF NOT EXISTS t_base_pinyin (pin_yin_ varchar(255) CHARACTER SET gbk NOT NULL,code_ int(11) NOT NULL,PRIMARY KEY (code_) ) ENGINEInnoDB DEFAULT CHARSETlatin1;-- 插入数据 INSERT INTO t_base_pinyin (pin_yin_,code_) VAL…

数据挖掘的一些经典算法

数据挖掘能做以下七种不同事情(分析方法):数据挖掘能做以下七种不同事情 分类 (Classification) 估计(Estimation) 预测(Prediction) 相关性分组或关联规则(…

python cx oracle安装_python3.6的安装及cx_oracle安装

一、创建所需目录mkdir -p /home/用户名/software/python3.6.1mkdir -p /home/用户名/priv/bydmkdir -p /home/用户名/priv/byd/src/pythonmkdir -p /home/用户名/priv/byd/org二、修改byd目录的权限cd /home/用户名/priv/llchmod 777 byd/ll三、将安装包放到byd中,…

opencv 无法找到tbb_debug.dll

本人环境:vs 2010 在opencv(你的opencv install 路径)\build\common\tbb\ia32\vc10下,将tbb.dll 拷贝一份,改名为tbb_debug.dll. 并将此路径加入到系统环境变量中即可。转载于:https://blog.51cto.com/danielllf/871369

【天命奇御】成就进度62/71的通关攻略(1·开篇前言)

天命奇御于2018.8.9号在wegame上发售 先是一周目记录: 可以说一周目是熟悉最终boss技能后,靠技术过的...... 然后是二周目记录: 开篇前言: 转载于:https://www.cnblogs.com/wuduojia/p/9494700.html

使用git上传代码到github

1. github上创建项目 github是一个服务器托管商,我们写好的代码可以上传到github上面去 登录github的官方网站:http://github.com/ 注册一个自己的用户 新建一个项目,我这里有我自己的一个github账号,我直接登录上去了&am…

gpg加密命令 linux_用 PGP 保护代码完整性(五):将子密钥移到一个硬件设备中 | Linux 中国...

在这个系列教程中,将为你提供使用 PGP 和保护你的私钥的最佳体验。-- Konstantin Ryabitsev致谢译自 | linux.com 作者 | Konstantin Ryabitsev译者 | LCTT / qhwdw在这个系列教程中,将为你提供使用 PGP 和保护你的私钥的最佳体验。在本系列教程中&#…

在Android使用XML文件控制按钮文字在各种状态下的颜色

最近在项目中遇到新的需求,就是在按钮在选按的时候需要将文字变为白色,但android默认的按钮颜色为黑色,之前也没有考虑过类似的问题。 通过doc文档,发现按钮文字的处理方式和背景的处理方式很相似,同样可以用一份selec…

人人网 6.0 版申请页面随着滚动条拖动背景图片滚动出现的原理

第一步是考虑静态实现。整个页面分成几大块&#xff0c;比如&#xff1a; <div class"section" id"topic-a"></div> <div class"section" id"topic-b"></div> <div class"section" id"topi…

Python内部类,内部类调用外部类属性,方法

一 Python中内部类 典型定义&#xff1a; class MyOuter:age18def __init__(self,name):self.namenameclass MyInner:def __init__(self,inner_name):self.inner_nameinner_nameoutMyOuter(lqz) innerout.MyInner(lqz_inner) print(inner.inner_name) 二 内部类调用外部类的类属…

POJ 2528 Mayor's posters(线段树)

题目大意 贴海报。每张海报的高度都是一样的&#xff0c;唯独宽度不一样。每张海报只能占用整数倍的单位线段长度&#xff0c;贴了 n(n<10000) 张海报之后&#xff0c;有几张能够看见&#xff08;有一个角能看见这张海报也算被看见了&#xff09;&#xff1f;海报的宽度最大…

xmind 模板_xmind模板打包下载

500套xmind模板【分类整合】好东西分享啦&#xff01;~百度网盘下载链接&#xff1a;https://pan.baidu.com/s/1pCf8aqM8R8m4U4oWZUfOUA提取码&#xff1a;xt1j 微云盘下载连接&#xff1a; https://share.weiyun.com/5c3vehsXMind中的思维导图结构包含一个中心根主题&#xff…

Pycharm的运行和简单调试

我这里已经简单的创建了一个文件&#xff0c;为了浅显易懂&#xff0c;这里程序写的比较简单 1. 运行程序 首先&#xff0c;找到编辑窗口上面有一个向下方向的灰色箭头&#xff0c;点击它 点击之后&#xff0c;选择第一个选项edit Configurations&#xff0c;然后在弹出…

为什么百度只收录我的网站首页?

在我们做SEO的时候&#xff0c;经常碰到一个常见的问题&#xff0c;百度只收录网站的首页或者是一夜之间网站的收录变成了只剩首页。出现这种情况的原因很多&#xff0c;我们需要去检查自己的问题&#xff0c;然后去解决&#xff0c;让自己的网站重新获得更多页面的收录&#x…

Python3.5 学习十二 数据库介绍

MYSQL介绍&#xff1a; 主流三种数据库&#xff1a;Oracle、Mysql、Sqlserver Mysql安装和启动&#xff1a; windows 1安装 2启动服务 3进入bin目录&#xff0c;打开命令行 4 mysqladmin -u root password ******* 设置密码 5 mysql -u root -p 使用密码登录 显示所有数据…

github上删除一个仓库

首先进入到你需要删除的仓库&#xff0c;在这个页面的左侧或者上部找到”settings”选项 点击进入”settings”&#xff0c;然后一直往下拉&#xff0c;直到看到一个红色的横条区域&#xff0c;下面有一个”Delet this respository”&#xff0c;点击删除即可

两个线程同时访问一个变量_百战程序员:Java多线程对象及变量的并发访问

在开发多线程程序时&#xff0c;如果每个多线程处理的事情都不一样&#xff0c;每个线程都互不相关&#xff0c;这样开发的过程就非常轻松。但是很多时候&#xff0c;多线程程序是需要同时访问同一个对象&#xff0c;或者变量的。这样&#xff0c;一个对象同时被多个线程访问&a…

AE 9.3代码 升级到AE10.0

下载的代码是AE 9.3&#xff0c;本机配置是AE 10.0 &#xff0c;程序打不开&#xff0c;运行不了&#xff0c;提示找不到ESRI.ArcGIS.Controls.AxMapCongrol等等AE 控件。 具体解决方法&#xff1a; &#xff08;1&#xff09; 在引用中&#xff0c;重新添加ArcGIS引用&#xf…

mysql数据库主从同步过程详述(三)

续mysql数据库主从同步过程详述(二)在此说明下:在最后试验过程中,当查看从库状态的时候,IO_Running显示为no,从error_log中看到如下报错提示:120523 0:55:31 [Note] Slave I/O thread: connected to master rep192.168.1.5:3306, replication started in log mysql-bin.0000…

[No0000160]常用C# 正则表达式大全

正则表达式的本质是使用一系列特殊字符模式&#xff0c;来表示某一类字符串。正则表达式无疑是处理文本最有力的工具&#xff0c;而.NET提供的Regex类实现了验证正则表达式的方法。Regex 类表示不可变&#xff08;只读&#xff09;的正则表达式。它还包含各种静态方法&#xff…

在VS中,如何新建项目,如何添加类库

学习了C#基础后就自己做了一个小小的qq空间&#xff0c;感觉挺好的。之后&#xff0c;由于团队需要被分配到测试方面去了&#xff0c;虽然测试时会看C#代码&#xff0c;但终究不是自己写的&#xff0c;没有那种深究的热情&#xff0c;尽管师兄说&#xff0c;看代码是最快提升的…

Python中requests包的安装

在使用pycharm开发的时候&#xff0c;我们经常需要导入一些包&#xff0c;但是这些包&#xff0c;我们事先并没有安装&#xff0c;一个显著的现象就是我们在pycharm中导入一个包时&#xff0c;系统提示不存在&#xff0c;那就是我们没有安装这个包。举一个例子&#xff0c;我在…

python fft库有哪些_Python图像处理库PIL中快速傅里叶变换FFT的实现(一)

离散傅里叶变换(discrete Fouriertransform)傅里叶分析方法是信号分析的最基本方法&#xff0c;傅里叶变换是傅里叶分析的核心&#xff0c;通过它把信号从时间域变换到频率域&#xff0c;进而研究信号的频谱结构和变化规律。FFT是一种DFT的高效算法&#xff0c;称为快速傅立叶变…

转: Android ListView 滑动背景为黑色的解决办法

2019独角兽企业重金招聘Python工程师标准>>> 在Android中&#xff0c;ListView是最常用的一个控件&#xff0c;在做UI设计的时候&#xff0c;很多人希望能够改变一下它的背景&#xff0c;使他能够符合整体的UI设计&#xff0c;改变背景背很简单只需要准备一张图片然…

BZOJ1901Zju2112 Dynamic Rankings——树状数组套主席树

题目描述 给定一个含有n个数的序列a[1],a[2],a[3]……a[n]&#xff0c;程序必须回答这样的询问&#xff1a;对于给定的i,j,k&#xff0c;在a[i],a[i1],a[i2]……a[j]中第k小的数是多少(1≤k≤j-i1)&#xff0c;并且&#xff0c;你可以改变一些a[i]的值&#xff0c;改变后&#…

Git与github基本操作

一. git安装与简单配置 1. git的安装 首先进入git的官方网站git-scm.com 下载自己电脑对应的git版本&#xff0c;然后点击安装即可 点击上图的红色部分进行下载 安装的时候直接默认即可 找到你的Git安装位置&#xff0c;把快捷方式中的git bash发送到桌面&#xff0…

容器 root权限运行_【漏洞通告】Containerd容器逃逸漏洞通告 (CVE202015257)

2020年12月1日&#xff0c;Containerd发布更新&#xff0c;修复了一个可造成容器逃逸的漏洞CVE-2020-15257&#xff0c;并公开了相关说明。通过受影响的API接口&#xff0c;攻击者可以利用该漏洞以root权限执行代码&#xff0c;实现容器逃逸。深信服安全研究团队依据漏洞重要性…

IOS成长之路-NSMutableURLRequest实现Post请求

NSData *bodyData [[bodyString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]dataUsingEncoding:NSUTF8StringEncoding];//把bodyString转换为NSData数据 NSURL *serverUrl [[NSURL URLWithString:RequestUrl] URLByAppendingPathComponent:urlStr];//获…

rsync ssh文件同步

参考链接 下载 manual #rsync -avP -e ssh ./filename root192.68.1.38:/root/paths/ &#xff08;本地到远程&#xff09; #rsync -avP -e ssh root192.68.1.38:/root/paths/test.tar.gz /root /paths &#xff08;远程到本地&#xff09; rsync -av --progress --inpl…