首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在python上进行多线程处理,以便同时运行两个相互关联的线程(或者可能是后台处理)

在python上进行多线程处理,以便同时运行两个相互关联的线程(或者可能是后台处理)
EN

Stack Overflow用户
提问于 2018-08-16 13:34:08
回答 1查看 524关注 0票数 1

我希望opencv中的VideoCapture函数在后台处理帧时工作平稳。由于处理需要3-4秒,所以当时拍摄视频挂起。因此,我需要运行两个线程,即一个捕获视频和其他处理它的输出和在屏幕上打印。我的代码到现在为止:

代码语言:javascript
运行
复制
age = None
while True:
    ret, frame = cam.read()
    if ret == True:
        # do some processing (3-4 seconds)
        age = process(frame)

        fr = update_age(frame, age)
        cv2.imshow('hello', fr)
        if cv2.waitKey(1) == 27:
            break
    else:
        print "error"
        break
cv2.destroyAllWindows()

因此,我需要一种方法,使我的第3行不需要等待3-4秒来更新它的帧,而处理帧和打印其输出在后台运行。

更多的澄清(也在评论中提到):

  • 我不想分开我的线程,因为一个线程依赖于其他线程的输出(帧),我只想单独运行我的线程
  • 我使用cv2.imshow()显示屏幕上的所有帧。因此,我需要捕捉到的每一帧让我的屏幕看起来光滑(而不只是停留在每4秒后)。并且在屏幕上显示处理的输出,即,一旦产生输出,它将保持在那里,直到下一个输出在4秒后生成。(就像一个人看着镜头,他的年龄在屏幕上显示,但如果是在4秒后更新)
EN

回答 1

Stack Overflow用户

发布于 2018-08-16 14:35:55

下面是multiprocessing的一个示例,您将在其中捕获框架并在以后处理它们:

代码语言:javascript
运行
复制
from multiprocessing import Process
import time

frame_data = 0

def capture_video():
    print('recording...')
    return frame_data

def process_frame(frame_data):
    time.sleep(3)
    print(frame_data)
    return frame_data

if __name__ == '__main__':
    while True:
        data = capture_video()
        p = Process(target=process_frame, args=(frame_data,))
        p.start()
        time.sleep(0.1) 
        frame_data = frame_data + 1

示例输出(删除了一些初始记录..。简约的印刷本):

代码语言:javascript
运行
复制
recording...
recording...
recording...
recording...
recording...
recording...
0
recording...
1
recording...
2
recording...
3
recording...
4
recording...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51878371

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档