opencv多线程读取摄像头[python]

  • Post author:
  • Post category:python




双线程读取摄像头


目的:

  1. 使用队列存储摄像头实时读取图像和释放,减少内存消耗
  2. 使用多线程,一个读线程一个处理线程


实现

#-*- 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 版权协议,转载请附上原文出处链接和本声明。