美文网首页python交流学习
python是如何利用多线进程优化视频应用到的? 原来是这样的

python是如何利用多线进程优化视频应用到的? 原来是这样的

作者: 78c40b03ee4e | 来源:发表于2019-02-16 15:38 被阅读27次

前言

如果要用Python播放视频,或者打开摄像头获取视频流,我们可以用OpenCV Python。但是在视频帧获取的时候同时做一些图像识别和处理,可能会因为耗时多而导致卡顿。一般来说,我们首先会想到把这些工作放入到线程中处理。但是由于Python GIL的存在,用不用线程几乎没有区别。所以要解决这个问题,必须通过多进程。这里分享下使用Dynamsoft Barcode Reader开发Python条形码扫码的例子。

学习从来不是一个人的事情,要有个相互监督的伙伴,工作需要学习python或者有兴趣学习python的伙伴可以私信回复小编“学习”或者评论,留言,点赞 领取全套免费python学习资料、视频()装包

用Python和摄像头打造的桌面条形码扫码应用

安装Dynamsoft Barcode Reader:

pip install dbr

安装OpenCV Python

pip install opencv-python

在主程序中创建一个新的扫码进程和共享内存:

from multiprocessing import Process, Queue
frame_queue = Queue(4)
finish_queue = Queue(1)
dbr_proc = Process(target=dbr_run, args=(
        frame_queue, finish_queue))
dbr_proc.start()

通过OpenCV不断获取视频帧插入到队列中:

vc = cv2.VideoCapture(0)
 
if vc.isOpened():  # try to get the first frame
    rval, frame = vc.read()
else:
    return
 
windowName = "Barcode Reader"
base = 2
count = 0
while True:
    cv2.imshow(windowName, frame)
    rval, frame = vc.read()
 
    count %= base
    if count == 0:
        try:
            frame_queue.put_nowait(frame)
        except:
            try:
                while True:
                    frame_queue.get_nowait()
            except:
                pass
 
    count += 1

条形码读取进程不断从队列中拿出数据进行解码:

def dbr_run(frame_queue, finish_queue):
    dbr.initLicense(config.license)
    while finish_queue.qsize() == 0:
        try:
            inputframe = frame_queue.get_nowait()
            results = dbr.decodeBuffer(inputframe, config.barcodeTypes)
            if (len(results) > 0):
                print(get_time())
                print("Total count: " + str(len(results)))
                for result in results:
                    print("Type: " + result[0])
                    print("Value: " + result[1] + "\n")
        except:
            pass
 
    dbr.destroy()

这样基本完成。不过在app退出的时候会看到一些错误信息:

Traceback (most recent call last):
 
File "E:\Programs\Python\Python36\lib\multiprocessing\queues.py", line 236, in _feed
 
send_bytes(obj)
 
File "E:\Programs\Python\Python36\lib\multiprocessing\connection.py", line 200, in send_bytes
 
self._send_bytes(m[offset:offset + size])
 
File "E:\Programs\Python\Python36\lib\multiprocessing\connection.py", line 290, in _send_bytes
 
nwritten, err = ov.GetOverlappedResult(True)
 
BrokenPipeError: [WinError 109] The pipe has been ended

记得在结束应用之前要清空队列中的数据:

def clear_queue(queue):
    try:
        while True:
            queue.get_nowait()
    except:
        pass
    queue.close()
    queue.join_thread()

程序运行效果:


相关文章

  • python是如何利用多线进程优化视频应用到的? 原来是这样的

    前言 如果要用Python播放视频,或者打开摄像头获取视频流,我们可以用OpenCV Python。但是在视频帧获...

  • Python札记52_进程和线程2

    在之前的札记Python札记50_进程和线程1中介绍了进程、线程和子进程以及多进程的相关知识,本札记中重点介绍多线...

  • python线程池的简单实现

    为了在项目中管理优化线程数量,线程池是必不可少的。Python的在multiprocess中有进程池作为进程管理,...

  • 线程、进程和协程

    线程、进程和协程 进程、线程与并发 对多核的支持 实现一个线程 线程之间的通信 线程的调度和优化 为什么要学习多线...

  • APP的性能优化的几种方法

    APP的优化可以从如何高效地利用线程、如何优化设备的电池寿命、实现低内存占用UI等方面来考虑,例如在后台取消一些线...

  • python多进程和多线程的选择

    由于GIL的存在,无论是python2还是python3都无法很好地利用多线程并发执行。 对于单核CPU而言,多线...

  • Python多线程,多进程

    以实用为目的,记几个python的多线程,多进程模块 一、多线程 Thread模块 Threading模块 当多线...

  • 精益数据分析组团读书活动

    近来有很多小伙伴说学习了python、sql、powerbi、tableau 这样的硬技能,但是不知道如何应用到数...

  • 线程和线程池

    线/进程、多线/多进程、线程并发/并行 一、线程、进程概念 进程:是程序的一次运行活动,由系统资源分配和调度的一个...

  • kill指定名称的进程

    说明:需要kill掉所有包含python的进程 方法一:利用xargs ps -ef|grep python|aw...

网友评论

    本文标题:python是如何利用多线进程优化视频应用到的? 原来是这样的

    本文链接:https://www.haomeiwen.com/subject/ygzbeqtx.html