使用yield而不是return创建一个函数来连续从http流生成帧

2024-02-17

我想创建一个函数,使用以下命令从 HTTP 流中读取帧requests http://docs.python-requests.org/en/master/并返回每一帧。但由于流读取器基于迭代器对象(如果我理解正确的话),返回帧会破坏流。

我正在使用的代码(工作得很好,来自this https://stackoverflow.com/a/42904920/6331998回答):

import cv2
import requests
import numpy as np

r = requests.get('http://roofcam.warwick.ac.uk/cgi-bin/faststream.jpg', stream=True)
if(r.status_code == 200):
    bytes_buffer = bytes()
    for chunk in r.iter_content(chunk_size=1024):
        bytes += chunk
        a = bytes_buffer.find(b'\xff\xd8')
        b = bytes_buffer.find(b'\xff\xd9')
        if a != -1 and b != -1:
            jpg = bytes_buffer[a:b+2]
            bytes_buffer = bytes_buffer[b+2:]
            i = cv2.imdecode(np.fromstring(jpg, dtype=np.uint8), cv2.IMREAD_COLOR)
            cv2.imshow('i', i)
            if cv2.waitKey(1) == 27:
                exit(0)
else:
    print("Received unexpected status code {}".format(r.status_code))

我想要做的事情的概念(如果它是一个 while 函数而不是 for using 迭代器,我想要工作的返回):

import cv2
import requests
import numpy as np

r = requests.get('http://roofcam.warwick.ac.uk/cgi-bin/faststream.jpg', stream=True)

def get_frame_from_stream(r):
    if(r.status_code == 200):
        bytes_buffer = bytes()
        for chunk in r.iter_content(chunk_size=1024):
            bytes_buffer += chunk
            a = bytes_buffer.find(b'\xff\xd8')
            b = bytes_buffer.find(b'\xff\xd9')
            if a != -1 and b != -1:
                jpg = bytes_buffer[a:b + 2]
                bytes_buffer = bytes_buffer[b + 2:]
                i = cv2.imdecode(np.fromstring(
                    jpg, dtype=np.uint8), cv2.IMREAD_COLOR)
                return i

    else:
        print("Received unexpected status code {}".format(r.status_code))
        return None

while True:
    if img is not None:
        img = get_frame_from_stream(r)
        cv2.imshow('i', img)
        cv2.waitKey(0)
    else:
        break

所以基本上我想返回原始代码显示帧的每个帧,以便我可以对其执行一些处理。但我不明白 iter_content 到底是如何让原始代码连续工作的。

(我不知道如何命名这个问题 - 欢迎更好的标题)


Python有一个非常美丽的概念generators https://wiki.python.org/moin/Generators,这可能是您正在寻找的东西,所以基本上是为了制造一个generator我们使用关键字yield https://docs.python.org/2/reference/simple_stmts.html#the-yield-statement代替return https://docs.python.org/2/reference/simple_stmts.html#the-return-statement。这两个关键字之间的基本区别在于return语句一旦遇到就会停止函数执行,而另一方面yield关键字让执行继续并继续生成值直到存活。它可以用一个简单的例子来形象化:

def sample_function():
    # The body would be replaced by image generating code.
    for i in xrange(20):
        yield i**2

for x in sample_function():
    print x, 
>>> 0 1 4 9 16 25 36 49 64 81 100 121 144 169 196 225 256 289 324 361

如果我们使用以下命令重现相同的场景return语句,那么它可能看起来像:

def sample_function(i):
    return i**2

for i in xrange(0, 20):
    print sample_function(i),

所以在上面的代码中如果你替换return关键字与yield,那么您可以将帧迭代为:

for frame in get_frame_from_stream(r):
    cv2.imshow('i', frame)

没有必要while循环就是这种情况,除非并且直到该流处于活动状态,该方法将继续生成帧。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用yield而不是return创建一个函数来连续从http流生成帧 的相关文章

  • 如何在刻度标签和轴之间添加空间

    我已成功增加刻度标签的字体 但现在它们距离轴太近了 我想在刻度标签和轴之间添加一点呼吸空间 如果您不想全局更改间距 通过编辑 rcParams 并且想要更简洁的方法 请尝试以下操作 ax tick params axis both whic
  • 更改自动插入 tkinter 小部件的文本颜色

    我有一个文本框小部件 其中插入了三条消息 一条是开始消息 一条是结束消息 一条是在 单位 被摧毁时发出警报的消息 我希望开始和结束消息是黑色的 但被毁坏的消息 参见我在代码中评论的位置 插入小部件时颜色为红色 我不太确定如何去做这件事 我看
  • OpenCV 中的 Gabor 内核参数

    我必须在我的应用程序中使用 Gabor 过滤器 但我不知道这个 OpenCV 方法参数值 我想对虹膜进行编码 启动 Gabor 过滤器并获取特征 我想对 12 组 Gabor 参数值执行此操作 然后我想计算 Hamming Dystans
  • 如何在Windows上模拟socket.socketpair

    标准Python函数套接字 套接字对 https docs python org 3 library socket html socket socketpair不幸的是 它在 Windows 上不可用 从 Python 3 4 1 开始 我
  • 如何将 Opencv VideoWriter 与 GStreamer 结合使用?

    我正在尝试使用 Opencv VideoWriter 传输 h264 流 以使用 VideoCapture 将其传输到网络上的另一台电脑上 但是 我被困在 VideoWriter 上 执行此代码会返回错误 并且 out isOpened 始
  • SQL Alchemy 中的 NULL 安全不等式比较?

    目前 我知道如何表达 NULL 安全的唯一方法 SQL Alchemy 中的比较 其中与 NULL 条目的比较计算结果为 True 而不是 NULL 是 or field None field value 有没有办法在 SQL Alchem
  • 如何使用 Scrapy 从网站获取所有纯文本?

    我希望在 HTML 呈现后 可以从网站上看到所有文本 我正在使用 Scrapy 框架使用 Python 工作 和xpath body text 我能够获取它 但是带有 HTML 标签 而且我只想要文本 有什么解决办法吗 最简单的选择是ext
  • 为 pandas 数据透视表中的每个值列定义 aggfunc

    试图生成具有多个 值 列的数据透视表 我知道我可以使用 aggfunc 按照我想要的方式聚合值 但是如果我不想对两列求和或求平均值 而是想要一列的总和 同时求另一列的平均值 该怎么办 那么使用 pandas 可以做到这一点吗 df pd D
  • Python tcl 未正确安装

    我刚刚为 python 安装了graphics py 但是当我尝试运行以下代码时 from graphics import def main win GraphWin My Circle 100 100 c Circle Point 50
  • 使用 Pycharm 在 Windows 下启动应用程序时出现 UnicodeDecodeError

    问题是当我尝试启动应用程序 app py 时 我收到以下错误 UnicodeDecodeError utf 8 编解码器无法解码位置 5 中的字节 0xb3 起始字节无效 整个文件app py coding utf 8 from flask
  • 在pyyaml中表示具有相同基类的不同类的实例

    我有一些单元测试集 希望将每个测试运行的结果存储为 YAML 文件以供进一步分析 YAML 格式的转储数据在几个方面满足我的需求 但测试属于不同的套装 结果有不同的父类 这是我所拥有的示例 gt gt gt rz shorthand for
  • Python - 按月对日期进行分组

    这是一个简单的问题 起初我认为很简单而忽略了它 一个小时过去了 我不太确定 所以 我有一个Python列表datetime对象 我想用图表来表示它们 x 值是年份和月份 y 值是此列表中本月发生的日期对象的数量 也许一个例子可以更好地证明这
  • Numpy 优化

    我有一个根据条件分配值的函数 我的数据集大小通常在 30 50k 范围内 我不确定这是否是使用 numpy 的正确方法 但是当数字超过 5k 时 它会变得非常慢 有没有更好的方法让它更快 import numpy as np N 5000
  • 如何改变Python中特定打印字母的颜色?

    我正在尝试做一个简短的测验 并且想将错误答案显示为红色 欢迎来到我的测验 您想开始吗 是的 祝你好运 法国的首都是哪里 法国 随机答案不正确的答案 我正在尝试将其显示为红色 我的代码是 print Welcome to my Quiz be
  • 通过数据框与函数进行交互

    如果我有这样的日期框架 氮 EG 00 04 NEG 04 08 NEG 08 12 NEG 12 16 NEG 16 20 NEG 20 24 datum von 2017 10 12 21 69 15 36 0 87 1 42 0 76
  • 从 Python 中的类元信息对 __init__ 函数进行类型提示

    我想做的是复制什么SQLAlchemy确实 以其DeclarativeMeta班级 有了这段代码 from sqlalchemy import Column Integer String from sqlalchemy ext declar
  • 循环标记时出现“ValueError:无法识别的标记样式 -d”

    我正在尝试编码pyplot允许不同标记样式的绘图 这些图是循环生成的 标记是从列表中选取的 为了演示目的 我还提供了一个颜色列表 版本是Python 2 7 9 IPython 3 0 0 matplotlib 1 4 3 这是一个简单的代
  • 协方差矩阵的对角元素不是 1 pandas/numpy

    我有以下数据框 A B 0 1 5 1 2 6 2 3 7 3 4 8 我想计算协方差 a df iloc 0 values b df iloc 1 values 使用 numpy 作为 cov numpy cov a b I get ar
  • Python:元类属性有时会覆盖类属性?

    下面代码的结果让我感到困惑 class MyClass type property def a self return 1 class MyObject object metaclass MyClass a 2 print MyObject
  • Pandas 与 Numpy 数据帧

    看这几行代码 df2 df copy df2 1 df 1 df 1 values 1 df2 ix 0 0 我们的教练说我们需要使用 values属性来访问底层的 numpy 数组 否则我们的代码将无法工作 我知道 pandas Data

随机推荐

  • 如何动态添加 Javascript 函数(并调用)

    基于页面上的单击事件 通过 ajax 我获取一段 html 和脚本 我能够获取 script 元素并将其附加到 head 元素 但是基于 WebKit 的浏览器不会将其视为脚本 即 我无法调用附加脚本中声明的函数 使用 Chrome 开发人
  • 如何从其他网站导入 Facebook 好友

    我正在寻找一种连接 Facebook 的方法 允许用户输入他们的用户名和密码 让我们的应用程序连接到他们的帐户并获取他们的联系人 以便他们可以邀请他们加入我们网站上的群组 我之前写过一个 Facebook 应用程序 但这不是一个应用程序 而
  • Python:从某个列表中获取最大N个元素

    是否有一些函数可以返回某个列表中的 N 个最高元素 I e if max l 返回单个最高元素 sth 喜欢max l count 10 会返回给我一个包含 10 个最高数字的列表 或者更少 如果l更小 或者什么是获得这些的有效简单方法 除
  • 是否可以以不区分大小写的方式匹配意图过滤器的路径模式?

    我们有一个 Android 应用程序可以打开某些类型的文件 我在 AndroidManifest xml 文件中为每个过滤器声明了一个意图过滤器 示例扩展名 ext
  • 如何根据目标像素替换 Numpy 图像数组中的所有 RGB 值

    我有一个 Numpy 数组中的图像 我将用黑色替换特定颜色 用白色替换所有其他颜色 For 循环速度很慢 而且我的 numpy 条件不起作用 与数组匹配的所有像素 gt 121 112 131 必须完全替换为另一个数组 gt 0 0 0 所
  • Python 和希伯来语编码/解码错误

    我有 sqlite 数据库 我想在其中插入希伯来语的值 我不断收到以下错误 UnicodeDecodeError ascii codec can t decode byte 0xd7 in position 0 ordinal not in
  • JavaFX 中的 Z 顺序

    如何设置 Z 顺序VBox在 JavaFX 中 JavaFX 中的 Z 顺序实际上是场景图中的顺序 例如 在场景的内容序列中 然后在组 容器等的内容中 所有节点还具有 toFront 和 toBack 函数来帮助更改此顺序 为了更好地控制
  • 修复“忽略 InnerClasses 属性”警告

    我想修复此警告 让我每次构建此输出 Error warning Ignoring InnerClasses attribute for an anonymous inner class Error com sun jna Native 1
  • 心理视觉图像相似度算法/库

    我正在寻找一种算法 最好是 C Rust 实现 来计算两个图像之间的感知相似性 同时考虑心理视觉因素 例如 色度差异并不像亮度差异那么糟糕 我有原始图像和它的多种变体 在我的例子中是 256 色量化 我想要算法来找到人类会判断哪张图像是最好
  • 如何在反应路由器转换中保持状态

    我已经设置了相当典型的反应路由器应用程序 var App React createClass render function return lt RouteHandler gt var routes
  • 如何在 NextJs 中共享两个项目中的组件?

    我不知道在我的特定情况下共享组件 ReactJs 的最佳选择是什么 我在 NextJs 中有两个应用程序 一个是电子商务 另一个是该电子商务的经理门户 在第一个应用程序 电子商务 中 我有 UI 组件 按钮 字段 标题 文本等 我想在其他项
  • svelte :更改 html 块内的变量值

    each list as item i div class item div
  • 什么是最低限度有效的 HTML5 文档?

    我刚刚阅读了 HTML5 作者规范 它指出 and 标签是optional 这是否意味着您可以完全忽略它们并仍然拥有有效的 HTML5 文档 如果我的解释正确 这意味着这应该是完全有效的 p Hello p 它是否正确 您可以在此处查看规格
  • Mercurial 中的 Reparenting:如何将两个独立的 svn 克隆重新组合在一起?

    情况是这样的 开发人员 Foo 从我们的 svn 存储库创建了一个 hg 存储库 Foo 的 hg repo 只是 svn 中主干的浅层克隆 没有 svn 分支 标签等 并且历史记录不完整 大约 100 个变更集 开发人员 Bar 做了同样
  • Mongo Query 获取不同的嵌套文档

    我需要获取不同的嵌套文档 请查找示例文档 propertyId 1001820437 date ISODate 2020 07 17T00 00 00 000Z HList productId 123 name Dubai tsh true
  • 错误-2147417848自动化错误调用的对象已与其客户端断开连接

    我正在清理 3 个 Excel 工作表中的一些表格 我的代码在 Excel 2007 上运行良好 当我切换到 Excel 2010 时 我开始收到此运行时错误自动化错误 调用的对象已与其客户端断开连接 错误号 2147417848然后exc
  • findOneAndUpdate 与推送数组元素在猫鼬中给出错误

    我的查询如下所示 const updateLikes item id userInfo gt return new Promise resolve reject gt itemLike findOneAndUpdate item id it
  • 以编程方式绘制一条粗略的线条

    我想知道你们是否知道我如何在 iOS 应用程序上绘制一条粗略的线条 目前 我正在借助 UIBezierPath 进行绘图 然后将其渲染到位图图形上下文中 我怎样才能让线条看起来很粗略 Produce and add points to dr
  • 将大型 numpy 数组拆分为训练和测试的内存有效方法

    我有一个很大的 numpy 数组 当我运行 scikit learn 的 train test split 将数组拆分为训练和测试数据时 我总是遇到内存错误 分割为训练和测试的更内存有效的方法是什么 为什么 train test split
  • 使用yield而不是return创建一个函数来连续从http流生成帧

    我想创建一个函数 使用以下命令从 HTTP 流中读取帧requests http docs python requests org en master 并返回每一帧 但由于流读取器基于迭代器对象 如果我理解正确的话 返回帧会破坏流 我正在使