OpenCV自学笔记之生产者消费者问题

/

软硬件环境

  • macOS High Sierra
  • opencv 3.3.1
  • anaconda3 & python 3.6.4

生产者消费者问题

Producer-Consumer problem,也称有限缓冲问题(Bounded-buffer problem),是一个多线程同步问题的经典案例,生产者负责生成一定量的数据放到缓冲区中;消费者在同一个缓冲区中消耗生产者生成的数据。该问题的关键就是要保证生产者不会再缓冲区满时加入数据,而消费者也不会再缓冲区空时消费数据。

在OpenCV中的应用

OpenCV的工作流: 输入 —> 处理 —> 输出,如果处理过程是相对耗时且耗资源的话,就需要在多线程中来处理,那就变成了典型的生产者消费者问题了。

代码实践

  1. # -*- coding: utf-8 -*-
  2. # @Time : 5/1/18 4:02 PM
  3. # @Author : xugaoxiang
  4. # @Email : djstava@gmail.com
  5. # @File : main.py
  6. # @Software: PyCharm
  7. from queue import Queue
  8. import threading
  9. import cv2
  10. import time, random
  11. class Producer(threading.Thread):
  12. def __init__(self, frame_queue):
  13. super(Producer, self).__init__()
  14. self.frame_queue = frame_queue
  15. def run(self):
  16. print('in producer')
  17. cap = cv2.VideoCapture('rtsp://admin:lj12345678@192.168.2.130:554/ISAPI/streaming/channels/102')
  18. print('cap is open',cap.isOpened())
  19. while True:
  20. ret,image = cap.read()
  21. print('get frame = ',ret)
  22. if (ret == True):
  23. # 如果是定长队列,需要判断当前队列中数据,不满时才塞入数据
  24. self.frame_queue.put(image)
  25. else:
  26. cap = cv2.VideoCapture('rtsp://admin:lj12345678@192.168.2.130:554/ISAPI/streaming/channels/102')
  27. print('cap is open',cap.isOpened())
  28. class Consumer(threading.Thread):
  29. def __init__(self, frame_queue):
  30. super(Consumer, self).__init__()
  31. self.frame_queue = frame_queue
  32. def run(self):
  33. print('in consumer')
  34. while True:
  35. print('frame_queue size=',self.frame_queue.qsize())
  36. # 如果是定长队列,需要判断当前队列中数据,不空时才取出数据
  37. frame = self.frame_queue.get()
  38. cv2.imshow('cap video',frame)
  39. if cv2.waitKey(1) & 0xFF == ord('q'):
  40. videoWriter.release()
  41. cap.release()
  42. cv2.destroyAllWindows()
  43. break
  44. if __name__ == '__main__':
  45. #定义队列,也就是数据缓冲区,可以指定队列大小,默认创建的是无限大的队列
  46. frame_queue = Queue()
  47. producer = Producer(frame_queue)
  48. producer.daemon = True
  49. producer.start()
  50. print('run Consumer')
  51. consumer = Consumer(frame_queue)
  52. consumer.daemon = True
  53. consumer.start()
  54. producer.join()
  55. consumer.join()

转载请注明作者和出处,并添加本页链接。
原文链接: http://xugaoxiang.com/post/121

给我留言