首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法两次启动python multiprocessing.Process

无法两次启动python multiprocessing.Process
EN

Stack Overflow用户
提问于 2021-12-15 12:32:06
回答 1查看 201关注 0票数 -1

下面是我的密码。我正在尝试扫描条形码并使用OpenCV显示它。该程序运行良好,但在从无人机相机抓取帧作为RTMP流时,fps有很大的滞后。由于同样的原因,我试图使用多种处理方法。

代码语言:javascript
复制
import pandas as pd
import cv2
import numpy as np
from pyzbar.pyzbar import decode
from pyzbar.pyzbar import ZBarSymbol
import time 
import multiprocessing 
global frame
def barcode(frame):
    for barcode in decode(frame, symbols=[ZBarSymbol.CODE128]):
        myData = barcode.data.decode('utf-8')
        pts = np.array([barcode.polygon],np.int32)
        pts = pts.reshape((-1,1,2))
        cv2.polylines(frame, [pts], True, (255,0,255),5)
        pts2 = barcode.rect
        akash = []
        akash.append(myData)
        cv2.putText(frame, myData, (pts2[0], pts2[1]), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (255,99,71), 2)

p1 = multiprocessing.Process(target = barcode)        

cv2.namedWindow("Result", cv2.WINDOW_NORMAL)

vid = cv2.VideoCapture(0)
if __name__ == '__main__':
    while(True):
        ret, frame = vid.read()
        if frame is not None:
            p1.start()   
            cv2.imshow('Result',frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
vid.release()
vid.destroyAllWindows()

而错误是

代码语言:javascript
复制
AssertionError                            Traceback (most recent call last)
<ipython-input-1-df50d7c70cda> in <module>
     27         ret, frame = vid.read()
     28         if frame is not None:
---> 29             p1.start()
     30             cv2.imshow('Result',frame)
     31         if cv2.waitKey(1) & 0xFF == ord('q'):

C:\ProgramData\Anaconda3\lib\multiprocessing\process.py in start(self)
    113         '''
    114         self._check_closed()
--> 115         assert self._popen is None, 'cannot start a process twice'
    116         assert self._parent_pid == os.getpid(), \
    117                'can only start a process object created by current process'

AssertionError: cannot start a process twice
EN

回答 1

Stack Overflow用户

发布于 2021-12-15 13:16:56

不要在循环中创建进程。使用进程的最佳方法是在之外创建n进程,然后在Queues的帮助下访问和推送数据。

在下面的代码中,我创建了5个进程,这些进程将无限地运行,并尝试从inQ队列中获取数据。然后,

  • 执行您正在执行的所有处理。在此之后,我将其推送到outQ< code >E 215队列,稍后我们将使用该队列来显示结果。H 216H 117主,我只是从am E 118vidvide 219对象中读取数据,并将其推入inQE 221,我们的进程将使用这些代码获取<.code>代码<123>,我只是获取下一个结果而已。这种方式在我看来更好,因为我们不必在每次迭代中创建流程,而且我们有多个进程可以随时处理数据。如果需要,还可以为队列设置缓冲区限制。此外,对于活动流,尝试使用skipFrame参数跳过几个帧。这会提高fps.

代码语言:javascript
复制
import cv2
import numpy as np
from pyzbar.pyzbar import decode
from pyzbar.pyzbar import ZBarSymbol
import time 
from multiprocessing import Process, Queue

inQ = Queue()
outQ = Queue()


def barcode():
    global inQ
    global outQ
    try:
        print("Solving..")
        frame = inQ.get()
        for barcode in decode(frame, symbols=[ZBarSymbol.CODE128]):
            myData = barcode.data.decode('utf-8')
            pts = np.array([barcode.polygon],np.int32)
            pts = pts.reshape((-1,1,2))
            cv2.polylines(frame, [pts], True, (255,0,255),5)
            pts2 = barcode.rect
            akash = []
            akash.append(myData)
            cv2.putText(frame, myData, (pts2[0], pts2[1]), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (255,99,71), 2)

            outQ.put(frame)
    except Exception as e:
        print(e)


for _ in range(5):  # configure yourself      
    Process(target = barcode).start()        

cv2.namedWindow("Result", cv2.WINDOW_NORMAL)


if __name__ == '__main__':
    print("Inside main")
    vid = cv2.VideoCapture(0)
    while vid.isOpened():
        print("While...")
        ret, frame = vid.read()
        if ret:
            try:
                inQ.put(frame)
            except Exception as e:
                print(e)
        try:
            output = outQ.get()
            cv2.imshow("Result", output)
        except Exception as e:
            print(e)

    vid.release()
    vid.destroyAllWindows()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70363743

复制
相关文章

相似问题

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