许多的范例程序大多仅介绍该如何用 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

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

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

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

  1. python 视频字幕合并_怎么把字幕和视频合并(教你两者合并方法)

    其实超简单超简单!python好现成的库,一下子省略了好多步骤! 本文在Windows环境下!linux只是不需要手动输入imagicmagick的位置! PS:如有需要Python学习资料的小伙伴可 ...

  2. python 视频快速温习_传智播客python12天学会Python系列视频 177个视频教程 完整学......

    传智播客python 12天学会Python系列视频 177个视频教程 完整学习Python 百度网盘下载: 游客,如果您要查看本帖隐藏内容请回复 提取码:p8qm 第01天视频\ 第02天视频\9 ...

  3. python视频课程推荐-《Python从小白到大牛》全集视频课程介绍

    python全集.jpg 本视频课程是<Python从小白到大牛>图书配套视频.视频课程共分为8部分: 第1部分Python基础: Python语言历史,Python语言的特点,开发环境的 ...

  4. python视频免费百度云-Python开发视频百度云分享

    原标题:Python开发视频百度云分享 Python有很好的3D渲染库和游戏开发框架,有很多使用Python开发的游戏,如迪斯尼卡通城.黑暗之刃.常用PyGame.Pykyra等和一个PyWeek的比 ...

  5. python 打包 小文件_[Python][小知识][NO.5] 使用 Pyinstaller 打包成.exe文件

    1.安装 pyinstaller 插件 cmd命令:pip install PyInstaller PS . o.o 不知道 easy_install 的百度吧. 2.pyinstaller 简介 他 ...

  6. python多进程编程实例_[python] Python多进程编程技术实例分析

    这篇文章主要介绍了Python多进程编程技术,包括了线程.队列.同步等概念及相关的技巧总结,需要的朋友可以参考下 本文以实例形式分析了Python多进程编程技术,有助于进一步Python程序设计技巧. ...

  7. python查看excel编码格式_[Python]实现处理读写xlsx xls excel文件格式(含中文处理方法)...

    最近有个需求要处理excel 格式的数据,数据量比较大.用传统的语言似乎不太好处理,于是改用python实现,这里记录一下实现过程. 首先,科普一下xlsx xls的excel文件区别是什么. xls ...

  8. python朋友圈刷屏_“Python太火了!请救救Java!”9万程序员刷屏朋友圈 !

    没想到有生之年,笔者能观察到"霸主陨落"的过程,继PLPY4月榜单官宣,Python躺赢,再度"夺"冠,实力甩下Java和C后,近期,Stack Overflo ...

  9. python shell如何打开_“python shell怎么打开“python shell启动教程

    python shell怎么打开 1.简介:如何在python中运行shell(bash命令) 2.工具/原料:python库:os.py 3.方法:import os command = 'date ...

最新文章

  1. leetCode C++ 二分查找 35. 搜索插入位置 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
  2. Extjs 4.0.7 中模式窗口的CURD
  3. 【中级软考】软件质量模型的六大特性27个子特性(软件质量特性:功能性、可靠性、易用性、效率性、软件维护性、软件可移植性)
  4. 调用函数,计算分段函数的值
  5. 装mysql最后一步没响应_解决MySQL安装到最后一步未响应的三种方法
  6. 二叉树为空意味着二叉树_不怕面试被问了!二叉树算法大盘点
  7. oracle数据库导出数据6,Oracle数据库导入导出方法汇总
  8. 81-linux cluster : lvs
  9. 马里兰大学calce电池循环测试数据集_Keras-建立RNN(循环神经网络)
  10. 西安工业大学计算机专业好吗,西安工业大学(专业学位)计算机技术考研难吗
  11. 大数据_Flink_数据处理_yarn和k8s平台的flink部署---Flink工作笔记0015
  12. 从0-1教你大屏制作!实时数据处理+零代码,它的可视化堪比python
  13. 认真把事办砸是一种能力
  14. python数组对应元素相乘_python – 将一个数组的每一行与numpy中另一个数组的每个元素相乘...
  15. c语言正弦波程序_DAC0832的波形信号发生器Proteus仿真设计,正弦波、三角波、方波和锯齿波...
  16. 无需输入密码,XP自动登录域
  17. sam格式的结构和意义_sam格式详细说明
  18. win10+Ubuntu双系统安装/卸载/扩容/同步时间
  19. Linux专家警告开源软件日益吸引黑客
  20. 【控制理论】MPC(一)

热门文章

  1. awk4.0 — awk格式化
  2. Socket/ServerSocket 选项
  3. java中JVM的原理【转】
  4. Java中单元测试中:@BeforeClass,@Before,@Test,@After,@AfterClass中的问题详解
  5. 【经典算法】快速排序
  6. resin-pro-4.0.34 服務器在windows环境下的配置
  7. ZooKeeper客户端地址列表的随机原理
  8. 精通ASP.NET中弹出窗口技术
  9. android AIDL IPC深入分析
  10. windows计算器