opencv python 多线程视频采集

2023-12-14

我正在尝试读取 2 个视频文件并同时在单独的 Windows 中显示它们。 这是我的代码:

import threading
import cv2
threadLock=threading.Lock()
class myThread (threading.Thread):
    maxRetries=20
    def __init__(self, threadID, name,video_url):
        threading.Thread.__init__(self)
        self.threadID = threadID
        self.name = name
        self.video_url=video_url

    def attemptRead(self,cvVideo):
        threadLock.acquire()
        (isRead,cvImage)=cvVideo.read()
        threadLock.release()
        if isRead==False:
            count=1
            while isRead==False and count<myThread.maxRetries:
                threadLock.acquire()
                (isRead,cvImage)=cvVideo.read()
                threadLock.release()
                print self.name+' try no: ',count
                count+=1
        return (isRead,cvImage)

    def run(self):
        print "Starting " + self.name
        windowName = self.name
        cv2.namedWindow(windowName)
        cvVideo = cv2.VideoCapture(self.video_url)


        while True:
            (isRead,cvImage)=self.attemptRead(cvVideo)
            if isRead==False:
                break
            cv2.imshow(windowName,cvImage)
            key=cv2.waitKey(50)
            if key==27:
                break

        cv2.destroyWindow(windowName)
        print self.name + "Exiting"

def main():
    thread1 = myThread(1, "Thread1",'C:/Traffic Pics/Videos/Panjim Capture.mp4')
    thread2 = myThread(2, "Thread2",'C:/Traffic Pics/Videos/Miramar Capture.mp4')

    thread1.start()
    thread2.start()

print "Exiting Main Thread"

if __name__ == '__main__':
    main()

发生的事情是,only the Thread 2 Window 正在显示. 线程1退出尝试阅读超出范围的视频后最大重试次数限制(我的例子是 10)。 问题是虽然我创建了单独的cvVideo对象,我似乎无法同时使用它们。 可能是什么问题呢?


*编辑:我将保留下面的代码,但我猜您有编解码器问题?我安装了 xvid 编解码器(这是示例 Megamind.avi 的编码方式),并且该程序在运行 megamind 视频的一个或两个线程上运行良好。你能让超级大智者视频在单线程版本中运行吗?

Here is 关于 opencv 视频编解码器的 SO 帖子如果有帮助的话。这里是xvid下载我用过(k-lite 不适合我)。


你写的代码基本上对我有用。对于您和其他想要尝试的人,我做了以下操作:

  • 应用 PEP 8 建议
  • 删除了不必要的读取尝试代码(这也删除了工作视频最后一帧后误导性的线程重新读取警告)
  • 使用了一个视频文件,也许每个使用 opencv 的人都有
  • 删除了线程锁定,这对 opencv 来说似乎并不重要,至少在我的系统上
  • 移动了一些其他的小东西

VideoCapture.read 可能会出现其他错误,这会使 read_attempt 方法值得,但我只能找到文档提到的两个错误。对于那些它只是返回 false,代码已经测试过了。

import os
import threading

import cv2

my_opencv_path = "C:/opencv2.4.3"
video_path_1 = os.path.join(my_opencv_path, "samples", "cpp", "tutorial_code",
                            "HighGUI", "video-input-psnr-ssim", "video",
                            "Megamind.avi")
video_path_2 = os.path.join(my_opencv_path, "samples", "c", "tree.avi")
assert os.path.isfile(video_path_1)
assert os.path.isfile(video_path_2)


class MyThread (threading.Thread):
    maxRetries = 20

    def __init__(self, thread_id, name, video_url, thread_lock):
        threading.Thread.__init__(self)
        self.thread_id = thread_id
        self.name = name
        self.video_url = video_url
        self.thread_lock = thread_lock

    def run(self):
        print "Starting " + self.name
        window_name = self.name
        cv2.namedWindow(window_name)
        video = cv2.VideoCapture(self.video_url)
        while True:
            # self.thread_lock.acquire()  # These didn't seem necessary
            got_a_frame, image = video.read()
            # self.thread_lock.release()
            if not got_a_frame:  # error on video source or last frame finished
                break
            cv2.imshow(window_name, image)
            key = cv2.waitKey(50)
            if key == 27:
                break
        cv2.destroyWindow(window_name)
        print self.name + " Exiting"


def main():
    thread_lock = threading.Lock()
    thread1 = MyThread(1, "Thread 1", video_path_1, thread_lock)
    thread2 = MyThread(2, "Thread 2", video_path_2, thread_lock)
    thread1.start()
    thread2.start()
    print "Exiting Main Thread"

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

opencv python 多线程视频采集 的相关文章

  • setColumnStretch 和 setRowStretch 如何工作

    我有一个使用构建的应用程序PySide2它使用setColumnStretch用于柱拉伸和setRowStretch用于行拉伸 它工作得很好 但我无法理解它是如何工作的 我参考了 qt 文档 但它对我没有帮助 我被困在括号内的两个值上 例如
  • 如何使用 Pycharm 运行 fast-api 服务器?

    我有一个简单的 API 函数 如下所示 from fastapi import FastAPI app FastAPI app get async def read root return Hello World 我正在使用启动服务器uvi
  • 如何进行重定向并保留查询字符串?

    我想进行重定向并保留查询字符串 就像是self redirect加上发送的查询参数 那可能吗 newurl my new route urllib urlencode self request params self redirect ne
  • 使用 Poetry 创建的 Python 项目:如何在 Visual Studio Code 中调试它?

    我有一个根据基本 Poetry 创建的 Python 项目指示 https python poetry org docs basic usage 项目文件夹是这样的 my project my project my project py F
  • java:如何设置全局线程ID?

    是否有可能为线程设置唯一ID 在分布式系统中 线程是在许多不同的机器上创建的 例如通过 RMI 我需要它来创建日志消息 根据我的研究 我知道可以使用 log4j mdc ndc 来完成 但只能在单线程中完成 我的问题是 在创建线程时必须设置
  • 如何使用 Python 在表单中选择选项?

    我想知道如何以格式如下的形式选择选项 td align left td
  • Plotly:如何设置文本格式(下划线、粗体、斜体)

    使用注释时 我尝试在绘图中为文本添加下划线 我使用添加注释 import plotly graph objects as go g go FigureWidget make subplots rows 1 cols 1 g update l
  • python os.fork 使用相同的 python 解释器吗?

    据我所知 Python 中的线程使用相同的 Python 解释器实例 我的问题是与创建的流程相同os fork 或者每个进程创建的os fork有自己的翻译吗 每当你 fork 时 整个 Python 进程都会在内存中复制 包括Python
  • 在 Python 中引发异常的正确方法是什么? [复制]

    这个问题在这里已经有答案了 这是简单的代码 import sys class EmptyArgs StandardError pass if name main The first way to raise an exception if
  • 类型错误:无法连接“str”和“int”对象有人可以帮助新手使用他们的代码吗?

    感谢任何帮助 还有任何重大缺陷或您在格式或基本方面看到的任何重大缺陷 请指出 谢谢 day raw input How many days locations raw input Where to days str day location
  • 在基本 Tensorflow 2.0 中运行简单回归

    我正在学习 Tensorflow 2 0 我认为在 Tensorflow 中实现最基本的简单线性回归是一个好主意 不幸的是 我遇到了几个问题 我想知道这里是否有人可以提供帮助 考虑以下设置 import tensorflow as tf 2
  • 配置 Django 和 Google 云存储?

    I am not使用应用引擎 我有一个在虚拟机上运行的普通 Django 应用程序 我想使用 Google Cloud Storage 来提供静态文件 以及上传 提供媒体文件 我有一个水桶 如何将 Django 应用程序链接到我的存储桶 我
  • 如何在 Jupyter Notebook 中选择 conda 环境

    我安装了 Anaconda 5 3 和 Python 3 7 根环境 之后我使用 Python 3 6 创建了一个新环境 py36 我激活了新环境activate py36 conda env list表明环境是活跃的 但是当我启动 Jup
  • 如何通过 API Gateway 使用事件调用类型调用 Lambda 函数?

    文件说 默认情况下 Invoke API 采用 RequestResponse 调用类型 您可以选择通过将 Event 指定为 InitationType 来请求异步执行 因此 我可以发送到我的函数 python 的就是到处都是 Inspi
  • 如何使用 Matplotlib 可视化标量二维数据?

    所以我有一个网格网格 矩阵 X 和 Y 以及标量数据 矩阵 Z 我需要将其可视化 最好是一些 2D 图像 在各点处带有颜色 显示 Z 值 我做了一些研究 但没有找到任何能完全满足我想要的效果的东西 pyplot imshow Z 看起来不错
  • 无法将 librosa 与 python 3 一起使用

    我已经在 Windows 上的 ubuntu 子系统上使用 pip3 正确安装了 librosa 但是当我尝试执行像这样的简单程序时 import librosa data sr librosa load sound mp3 print d
  • 混合语言源目录布局

    我们正在运行一个使用多种不同语言的大型项目 Java Python PHP SQL 和 Perl 到目前为止 人们一直在自己的私有存储库中工作 但现在我们希望将整个项目合并到一个存储库中 现在的问题是 目录结构应该是什么样的 我们应该为每种
  • 从 HDF5 文件中删除信息

    我意识到 SO 用户以前曾问过这个问题question https stackoverflow com questions 1124994 removing data from a hdf5 file rq 1但它是在 2009 年被问到的
  • Python 子进程:无法转义引号

    我知道以前曾问过类似的问题 但它们似乎都是通过重新设计参数的传递方式 即使用列表等 来解决的 但是 我这里有一个问题 因为我没有这个选项 有一个特定的命令行程序 我使用的是 Bash shell 我必须向其传递带引号的字符串 它不能不被引用
  • nltk 标记化和缩写

    我用 nltk 对文本进行标记 只是将句子输入到 wordpunct tokenizer 中 这会拆分缩写 例如 don t 到 don t 但我想将它们保留为一个单词 我正在改进我的方法 以实现更精确的文本标记化 因此我需要更深入地研究

随机推荐

  • iptables 脚本阻止除所需应用程序之外的所有互联网访问

    CONTEXT 我想要一个 shell 脚本来阻止所有到我的计算机的入站 出站流量 除非我决定要使用浏览器或其他应用程序 在这种情况下 我会调用它并且只有这些应用程序会运行 我研究了以前由聪明人制作的脚本 最后有源链接 并投入时间自己学习使
  • 随机生成 Spritekit 节点

    我正在制作一个游戏 其中有一个节点正在生成并从屏幕顶部掉落 但是我想让节点以 3 秒之间的随机时间间隔生成 因此 1 秒内生成一个 2 4 秒内生成下一个 1 7 秒内生成下一个 依此类推 我正在努力解决这个问题的代码应该是什么 我目前用于
  • “void();”是什么意思作为一个单独的语句在 C++ 中意味着什么? [复制]

    这个问题在这里已经有答案了 这个程序如何编译良好 int main void Does this create a void object here 我已经在 MSVC 和 GCC 下进行了测试 但void是一个不完整的类型 当您对任何其他
  • Android:在 Android Studio 中链接外部静态 C/C++ 库

    我已经看到了许多使用 Cmake 在 Android Studio 中运行本机代码的答案 但是 关于如何将预编译的 C C 库包含到 Android 中的答案却很少 以下是我尝试让本机库 首先尝试使用 a 工作所采取的步骤 1 mylib
  • 如何将 CropVariants 添加到 TYPO3 Flexform 中的图像字段

    我可以像这样覆盖 TCA 中图像字段的cropVaraints columnsOverrides gt image gt label gt LLL EXT myext Resources Private Language locallang
  • RSA 密钥转换为 PEM 文件

    如何转换此 RSA 公钥 109120132967399429278860960508995541528237502902798129123468757937266291492576446330739696001110 6039072308
  • Google 表格图表中的标题

    当我第一次在 Google 表格中创建图表时 标题位于一个可移动的框中 我可以在图表框中选择并拖动它 如果我随后以编程方式更改该标题 例如 chart chart modify setOption title ChartTitleNameR
  • 为什么我的 CLLocation 速度这么不准确?

    我正在使用 iPhone SDK 我想在我的应用程序中显示当前的速度 有很多应用程序可以做到非常精确 特别是对于跑步或骑自行车等低速情况 我见过的最好的是 RunKeeper 但是 在我的应用程序中 速度绝对不准确 在低速下 它始终为空 只
  • 判断Python是否处于交互模式

    在Python脚本中 有什么方法可以判断解释器是否处于交互模式 这很有用 例如 当您运行交互式 Python 会话并导入模块时 会执行略有不同的代码 例如 关闭日志记录 我看过判断python是否处于 i模式并尝试了那里的代码 但是 该函数
  • Android 中菜单中的图标不显示

    我想将菜单处理程序添加到我的项目中 我读http developer android com guide topics ui menus html同样 它很简单 但没有显示图标 我很困扰 我什至以编程方式添加了一个菜单项 我的代码是 Ove
  • 如何向合并的Word表格添加行?

    这就是桌子的样子 Code Sub WordTableTester Dim CurrentTable As table Dim wdDoc As Document Dim Rw As Long col As Long Dim wdFileN
  • jquery 验证远程响应格式

    尝试使用远程方法验证昵称 rules nickname required true remote checknick php 检查尼克就在这里 name addslashes POST nickname sql select from na
  • Docker:多阶段构建会产生多个镜像

    给出这个多阶段构建的小例子 FROM node 10 AS ui build WORKDIR usr src app FROM node 10 AS server build WORKDIR root EXPOSE 3070 ENTRYPO
  • Perl 内存使用分析和泄漏检测?

    我用 Perl 编写了一个在 Linux 上运行的持久网络服务 不幸的是 随着它的运行 它的驻留堆栈大小 RSS 不断增长 缓慢但稳定地增长 尽管我努力清除所有不需要的哈希键并删除对对象的所有引用 否则会导致引用计数保持不变并阻碍垃圾收集
  • GAE/J 该应用程序不存在 (app_id=u'application-id')

    我使用 maven gae plugin 来部署我的应用程序 它可以正常工作 直到我决定将其部署到不同 Google 帐户下的另一个应用程序 ID 我遇到了 此应用程序不存在 的问题 我发现 StackOverflow 中已经有一些答案 但
  • Laravel 4:通过验证之前和之后验证开始和结束日期

    我想验证表单中的两个日期字段 即 from date 和 end date 需要检查 from date 是否小于 end date rules array from date gt array sometimes date format
  • 使用分组更新

    我对看似简单的 UPDATE 语句感到困惑 我正在寻找使用两个值的更新 第一个 a 用于分组 第二个 b 用于查找相应组内的局部最小值 额外一点 b 上有一个阈值 任何 1 或更小的值都应保持原样 drop table t1 create
  • 使用调试器从内部函数调用外部函数中定义的变量

    来自jQuery 文档 JavaScript 指南 因为局部作用域通过函数起作用 所以定义的任何函数 在另一个函数中可以访问外部函数中定义的变量 function outer var x 5 var y 2 function inner c
  • 查找特定位置的邻居

    我有一个 2D 矩阵 我想找到该矩阵中 i j 的邻域 其中 x 和 y 方向的大小分别为 M 和 N 我知道这很容易做到 但我的问题是当 i j 接近角点并且 M 和 N 很大时 在这种情况下 我不想超出矩阵 MATLAB 中是否有任何函
  • opencv python 多线程视频采集

    我正在尝试读取 2 个视频文件并同时在单独的 Windows 中显示它们 这是我的代码 import threading import cv2 threadLock threading Lock class myThread threadi