Python3并行处理opencv视频帧

2023-12-29

我有一个视频文件,需要逐帧处理,然后需要在帧中显示结果。目前我正在按顺序进行处理并一一显示帧。

现在我想并行处理帧而不是顺序处理。一旦处理了 X 个帧,则 cv2.imshow 必须出现,并且必须以正确的顺序显示已处理的帧。

目前我的顺序代码如下所示

import cv2
import requests


def process_frame(bgr_image, jpg_as_text):
    try:
        # Post to api for processing and get the results
        # result = requests.post("example.com", data={"jpg": jpg_as_text})

        # Add results to bgr_image
        # cv2.putText()
    except Exception as e:
        print(e)
        pass
    # Show the frame
    cv2.imshow("frame", bgr_image)


video = cv2.VideoCapture("video.mp4")
i = 0


while video.isOpened():
    ret, bgr_image = video.read()
    if ret == True:
        img_height, img_width, _ = bgr_image.shape
        jpg_as_text = cv2.imencode(".jpg", bgr_image)[1].tostring()
        process_frame(bgr_image, jpg_as_text)
        print(i)
        i += 1
    else:
        break
    if cv2.waitKey(1) & 0xFF == ord("q"):
        break

video.release()
cv2.destroyAllWindows()

现在我应该重构什么来进行并行处理并在处理 X 个帧后预览帧。


OpenCV 在其 github 存储库中有一个多线程视频处理的示例。

https://github.com/opencv/opencv/blob/master/samples/python/video_threaded.py https://github.com/opencv/opencv/blob/master/samples/python/video_threaded.py

从 multiprocessing.pool 导入 ThreadPool 并为每个 cpu 核心启动一个新线程。 OpenCV 有一个名为 getNumberOfCPUs() 的函数

Example:

from __future__ import print_function

import numpy as np
import cv2 as cv

from multiprocessing.pool import ThreadPool
from collections import deque

from common import clock, draw_str, StatValue
import video


class DummyTask:
    def __init__(self, data):
    self.data = data
def ready(self):
    return True
def get(self):
    return self.data

if __name__ == '__main__':
    import sys

    print(__doc__)

    try:
        fn = sys.argv[1]
    except:
        fn = 0
    cap = video.create_capture(fn)


    def process_frame(frame, t0):
    # some intensive computation...
        frame = cv.medianBlur(frame, 19)
        frame = cv.medianBlur(frame, 19)
        return frame, t0

    threadn = cv.getNumberOfCPUs()
    pool = ThreadPool(processes = threadn)
    pending = deque()

    threaded_mode = True

    latency = StatValue()
    frame_interval = StatValue()
    last_frame_time = clock()
    while True:
        while len(pending) > 0 and pending[0].ready():
            res, t0 = pending.popleft().get()
            latency.update(clock() - t0)
            draw_str(res, (20, 20), "threaded      :  " +             str(threaded_mode))
            draw_str(res, (20, 40), "latency        :  %.1f ms" %     (latency.value*1000))
            draw_str(res, (20, 60), "frame interval :  %.1f ms" % (frame_interval.value*1000))
            cv.imshow('threaded video', res)
        if len(pending) < threadn:
            ret, frame = cap.read()
            t = clock()
            frame_interval.update(t - last_frame_time)
            last_frame_time = t
            if threaded_mode:
                task = pool.apply_async(process_frame, (frame.copy(), t))
            else:
                task = DummyTask(process_frame(frame, t))
            pending.append(task)
        ch = cv.waitKey(1)
        if ch == ord(' '):
            threaded_mode = not threaded_mode
        if ch == 27:
            break
    cv.destroyAllWindows()

您应该能够使用该示例代码并将图像处理放在 process_frame 函数中。

在循环中添加一个计数器,并在 count == X 时调用 cv2.imshow

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

Python3并行处理opencv视频帧 的相关文章

  • pandas read_csv 之前预处理数据文件

    我使用 SAP 的数据输出 但它既不是 CSV 因为它不引用包含其分隔符的字符串 也不是固定宽度 因为它具有多字节字符 它是一种 固定宽度 字符 为了将其放入 pandas 我当前读取文件 获取分隔符位置 对分隔符周围的每一行进行切片 然后
  • 在 Python 中延迟转置列表

    所以 我有一个延迟生成的可迭代的三元组 我试图弄清楚如何将其转换为 3 个可迭代对象 分别由元组的第一个 第二个和第三个元素组成 然而 我希望这件事能懒惰地完成 所以 举例来说 我希望 1 2 3 4 5 6 7 8 9 将变成 1 4 7
  • 我可以在 matplotlib 中的绘图左侧放置一个垂直颜色条吗?

    来自颜色条方法的 matplotlib 命令摘要 http matplotlib org api pyplot api html highlight colorbar matplotlib pyplot colorbar我知道关键字参数or
  • 当Java中set已经是原子的时候,为什么我们还需要compareAndSet呢?

    因为原子意味着线程安全 当 set 本身在java中是原子和线程安全的时候 我们什么时候使用compareAndSet 举例来说 我想以原子方式设置一个变量 以便每个其他线程都可以看到它 但我希望以线程安全的方式设置该变量 我可以简单地将其
  • 如何在plotly(python)中的刻度标签和图形之间添加空格?

    如果我使用绘图创建水平条形图 则每个条形的标签都与图表相对应 我想在标签和图表之间添加一些空间 填充 边距 我怎样才能做到这一点 Example import plotly offline as py import plotly graph
  • NumPy 数组与 SQLite

    我在 Python 中见过的最常见的 SQLite 接口是sqlite3 但是有什么东西可以很好地与 NumPy 数组或 rearray 配合使用吗 我的意思是 它可以识别数据类型 不需要逐行插入 并提取到 NumPy rec 数组中 有点
  • 获取字符串模板中所有标识符列表的函数(Python)

    对于标准库string template在Python中 有没有一个函数可以获取所有标识符的列表 例如 使用以下 xml 文件
  • 在多核上运行 python 线程

    我知道Python 2 7不允许在不同的内核上运行多个线程 你需要使用multiprocessing模块以实现某种程度的并发性 我正在看concurrent futuresPython 3 4 中的模块 是否使用ThreadPoolExec
  • lmfit模型拟合然后预测

    我正在领养lmfit进行曲线拟合并使用拟合模型进行预测 然而下面的代码并没有达到我想要的效果 能否请你帮忙 谢谢 import numpy as np from lmfit import Model def linearModel x a0
  • 右键单击 QPushButton 上的 contextMenu

    对于我的应用程序 我在 Qt Designer 中创建了一个 GUI 并将其转换为 python 2 6 代码 关于一些QPushButton 与设计器创建 我想添加右键单击上下文菜单 菜单选项取决于应用程序状态 如何实现这样的上下文菜单
  • 尝试校准keras模型

    我正在尝试通过 Sklearn 实现来校准我的 CNN 模型CalibratedClassifierCV 尝试将其包装为KerasClassifier并覆盖预测功能但没有成功 有人可以说我做错了什么吗 这是模型代码 def create m
  • 当元组列表中相同项目的值是字符串时,对它们的值求和

    如果我有这样的元组列表 my list books 5 books 10 ink 20 paper 15 paper 20 paper 15 我怎样才能把列表变成这样 books 15 ink 20 paper 50 即添加同一项目的费用
  • Thread.interrupt() 和 Thread.interrupted() 到底是如何工作的? [复制]

    这个问题在这里已经有答案了 从设置线程状态的角度来看 我不清楚这两种方法 Java 文档说 Thread interrupt 设置线程中断状态标志 调用 Thread interrupted 方法给出线程的状态并清除该标志 当这在实际场景中
  • Kivy TextInput 水平和垂直对齐(文本居中)

    如何在 Kivy 的 TextInput 中水平居中文本 I have the following screen But I want to centralize my text like this 这是我的 kv 语言的一部分 BoxLa
  • 使用具有可变数量索引的 numpy mggrid

    如何将 numpy mgrid 与可变数量的索引一起使用 我在 github 上找不到任何人将其与硬编码值以外的任何内容一起使用的示例 import numpy as np np mgrid 1 10 1 10 this works fin
  • 增强迪基-富勒测试中的 BIC 在 Python 中到底是如何工作的?

    这个问题是关于 statsmodels tsa stattools python 库 adfuller 中的增强迪基 富勒测试实现 原则上 AIC 和 BIC 应该计算一组可用模型的信息标准 并选择最好的模型 信息损失最低的模型 但它们在增
  • 如何在类型提示中定义元组或列表的大小

    有没有办法在参数的类型提示中定义元组或列表的大小 目前我正在使用这样的东西 from typing import List Optional Tuple def function name self list1 List Class1 if
  • 将二进制数据视为文件对象?

    在此代码片段 由另一个人编写 中 self archive是一个大文件的路径并且raw file是以二进制数据形式读取的文件内容 with open self archive rb as f f seek offset raw file s
  • 如何仅读取 CSV 文件每行的第一列 [重复]

    这个问题在这里已经有答案了 如何在Python中读取CSV文件每行的第一列 我的数据是这样的 1 abc 2 bcd 3 cde 我只需要循环第一列的值 另外 当我在 calc 中打开 csv 文件时 每行中的数据都在同一个单元格中 这正常
  • 如何使 Django 自定义管理命令参数不再需要?

    我正在尝试在 django 中编写自定义管理命令 如下所示 class Command BaseCommand def add arguments self parser parser add argument delay type int

随机推荐

  • jquery的问题?

    我有这个 jquery 问题已经好几天了 我对此很陌生 所以请原谅我在这个问题上的愚蠢 谢谢 html代码 ul class statuses li class message this is meant to increase every
  • onmouseover 在单击和鼠标移出事件之前触发?

    onmouseover 无法使用的链接 https stackoverflow com q 9930818 1048572当我尝试回答时 遇到了一个有趣的问题 经过一些记录实验后 我已经设置了http jsfiddle net RnGxP
  • boost::serialization:是否可以避免模板函数?

    我有一个来自外部库的结构 我为其编写了一些非侵入式序列化方法 还有这个结构的包装器 我试图保留从外部结构到这个包装器的所有依赖关系 问题是 所有序列化方法都是模板 因此它们是在头文件中定义的 并将依赖关系从外部库传播到每个序列化包装器的人
  • 如何调整Emacs的compile-goto-error从编译缓冲区获取的路径?

    我使用 Emacs 23 并遇到以下问题 我从 Emacs 中运行我们项目的构建系统 例如 M xcompile gt cd foo bar build 构建系统现在做了一些魔法 cd 到构建过程的某个子目录中 然后 gcc 抛出一个错误
  • Sass 编译器无法在 Sublime Text 3 中工作

    我在 Windows 7 机器上安装了 Sass 并且正在尝试编译一些 scss 每次 我都会得到以下输出 sass is not recognized as an internal or external command operable
  • 在 Parcel 构建期间在 HTML 文件中调用时,JavaScript 函数不会触发

    我有一个链接到 JavaScript 文件的基本 HTML 表单页面 这两个文件都存在于 Node 项目中 我使用 Parcel 作为捆绑器 因为我最终想将其转换为 TypeScript 当我在浏览器中运行html文件时 JavaScrip
  • 使用类从 ASP.NET 中的数据库填充下拉列表的方法是什么?

    我正在尝试使用如下所示的类从 sql server 填充下拉列表 当将数据绑定到下拉列表时 代码会崩溃 它在向下拉列表提供 dataValueField 和 datatTextField 时出错 HTML a aspx
  • 何时使用记录结构而不是结构,反之亦然?

    我最近发现关于recordC 中的关键字 发现它可以用作record struct如果我理解正确的话 以某种方式使其成为值类型而不是引用类型 但是 我很难理解何时确切使用record struct而不仅仅是struct 据我所见 recor
  • 如何给一个按钮设置多个标签?

    我有 16 个按钮 我对它们进行标记以将一些术语集与按钮配对并从 sqlite 数据库导入 所以 我这样标记它们 labelForButton and tagForButton class MyStruct public MyStruct
  • CodeIgniter 连接两个表

    我正在尝试使用 CodeIgniter 将两个表连接在一起 我使用 CodeIgniter 用户指南寻求帮助 我遇到了一些问题 仅显示一个表的数据 但我不知道为什么 有人可以帮我吗 这是我的代码 控制器 function getall th
  • Flutter:如何永久注册传感器(并且永远不会取消注册?)

    TL DR 如何让 Android 传感器永久运行 活动 注册我的应用程序 即使我关闭它 客观的 我正在制作一个 Flutter 应用程序 使用以下方法来计算您的步数计步器 https pub dev packages pedometer包
  • AWS EC2 Autoscaling:定义一个永不终止的主实例

    我使用具有自动缩放和负载平衡功能的 EC2 来托管我的 Web 应用程序 为了保证EC2实例之间的一致性 我只想允许从一个实例访问管理界面 因此所有写操作都在该实例上执行 然后其他实例定期下载已更改文件的副本 所以这是我的问题 我可以在我的
  • 如果参数等于这个字符串,定义一个像这个字符串的变量

    我正在做一些 bash 脚本 现在我得到了一个变量调用source和一个名为samples 像这样 source country samples US Canada Mexico 因为我想扩大源的数量 并且每个源都有自己的样本 所以我尝试添
  • 在 PHP 中使用 google image API 获取图像搜索结果的第一个 URL

    你知道一个 php 脚本 一个类就很好 可以获取 google api 图像搜索的第一个图像结果的 url 吗 谢谢 Example 正如 Sarfraz 所说 我找到了一种使用简单 HTML DOM 从 Google Image 结果中获
  • X11:通过命令行移动现有窗口?

    给定一个 X 客户端窗口 ID 有没有办法从命令行移动该窗口或更改其几何形状 xlsclients a Window 0x3000001 Machine ohm Name Terminal Icon Name foo Command foo
  • 将 DataGridView 值复制到 TextBox

    我试图得到这个问题的答案 但到目前为止没有任何帮助能够做到我想要的 我有这段代码 它的目的是查看所选行并将其列输出到相应的文本框中 private void DataGridView01 SelectionChanged object se
  • 为 REST-ful API 编写单元测试 [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正计划为 RESTful API 编写单元测试 我想知道我应该采取的方法 我最关心的方面与数据库状态有关 我的理解是 每次测试的测试目标的
  • 关于垃圾回收。为什么我们需要调用System.gc();?

    当引用的对象不再可供任何变量使用时 会自动调用垃圾收集 但我想知道为什么当自动调用垃圾回收时我们要显式调用 System gc 我们什么时候调用 System gc 你不知道 正如你所说 垃圾收集是自动的 System gc 甚至不强制进行
  • Ajax - 500 内部服务器错误

    我正在尝试在工作中为这个项目学习AJAX 我有一个加载患者正在服用的药物的网站 我递归地调用此 AJAX 函数 以便它将附加一个包含单一药物和 7 天历史记录的新表 我在 FF 和 IE 中执行代码时遇到问题 在镀铬中工作得非常好 我收到了
  • Python3并行处理opencv视频帧

    我有一个视频文件 需要逐帧处理 然后需要在帧中显示结果 目前我正在按顺序进行处理并一一显示帧 现在我想并行处理帧而不是顺序处理 一旦处理了 X 个帧 则 cv2 imshow 必须出现 并且必须以正确的顺序显示已处理的帧 目前我的顺序代码如