双线程读取摄像头
目的:
- 使用队列存储摄像头实时读取图像和释放,减少内存消耗
- 使用多线程,一个读线程一个处理线程
实现
#-*- coding:utf-8 _*-
import cv2
import multiprocessing as mp
"""
读取摄像头进程,将摄像头读取的图像存储到队列当中
"""
def ImgRead(DealFlag, ImgQueue):
cam = cv2.VideoCapture(0)
if not cam.isOpened():
print("Unable to open camera")
else:
while True:
ret, Img = cam.read()
if not ret:
break
if not DealFlag.value:
ImgQueue.put(Img)
DealFlag.value = 1
cam.release()
"""
处理图像线程,将图像从队列弹出,进行处理
"""
def ShowImg(DealFlag, ImgQueue):
while True:
if DealFlag.value and not ImgQueue.empty():
Img = ImgQueue.get()
DealFlag.value = 0
cv2.imshow('Img', Img)
cv2.waitKey(5)
def vision():
ImgQueue = mp.Queue() # 先进先出队列,实现不同进程数据交互
DealFlag = mp.Value('B', 0) # DealFlag为1,则表示有图片,可处理
Mps = []
Mps.append(mp.Process(target=ImgRead, args=(DealFlag, ImgQueue)))
Mps.append(mp.Process(target=ShowImg, args=(DealFlag, ImgQueue)))
[Mp.start() for Mp in Mps]
Mps[0].join()
[Mp.terminate() for Mp in Mps]
if __name__ == '__main__':
vision()
版权声明:本文为weixin_46327567原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。