我想线程化两个函数,第一个功能是流式传输视频并将帧传递给第二个函数,第二个函数读取帧使用光学字符识别并将帧转换为文本。如何将帧从第一个线程函数传递到第二个线程函数?
我已经完成的工作,第一个功能是将视频帧保存到本地文件'frame.jpg',同时使用'frame.jpg'中的第二个功能进行读取。是否可以将视频帧定义为全局变量并传递给读取函数?
import cv2
import pytesseract
from multiprocessing import Process
def video_straming(): #Video streaming function, First Function
vc = cv2.VideoCapture(0)
cv2.namedWindow("preview")
if vc.isOpened():
rval, frame = vc.read()
else:
rval = False
while rval:
rval, frame = vc.read()
cv2.imwrite('frame.jpg',frame)
key = cv2.waitKey(20)
if key == 27: # exit on ESC
break
cv2.destroyWindow("preview")
def reading(): #Reading from frame.jpg function, Second Function
while:
frame = cv2.imread('frame.jpg')
read = Image.fromarray(frame)
read = pytesseract.image_to_string(read)
if len(read) > 80:
break
if __name__ == '__main__':
video_stream = Process(target=video_streaming)
video_stream.start()
frame_read = Process(target=reading)
frame_read.start()
video_stream.join()
frame_read.join()
答案 0 :(得分:1)
希望这个答案仍然有用。
我使用multiprocessing.Pipe()通过cv2.VideoCapture()将视频帧从一个进程传递到另一个进程,以捕获帧并将每个图像写入Pipe。
导入多处理
multiprocessing.set_start_method('spawn')
video_outfrompipe,video_intopipe = multiprocessing.Pipe()
vs = multiprocessing.Process(target = VideoSource,args =(video_intopipe))
vs.start()
vc = multiprocessing.Process(target = VideoConsumer,args =(video_outfrompipe))
vc.start()
vs.join()
vc.join()