camera.py 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. from PyQt5.QtCore import QThread # 引入多线程,设备是多个,一个设备一个任务
  2. import cv2
  3. import numpy as np
  4. # from cv2 import VideoCapture
  5. # 1. 定义信号(引入)
  6. from PyQt5.QtCore import pyqtSignal
  7. class CameraDev(QThread):
  8. # 定义信号(定义)
  9. sig_video = pyqtSignal(bytes, int, int, int) # 信号传递的数据(图像的二进制数据,字节序列(bytes), 图像高度int,宽度int,通道数int)
  10. def __init__(self):
  11. super(CameraDev, self).__init__()
  12. # 开始视频抓取的任务初始化
  13. # 初始化摄像头
  14. self.cam = cv2.VideoCapture(
  15. 0, # 摄像头的编号,从0
  16. cv2.CAP_DSHOW # 视频的处理调用DirectX 3D (DirectShow)
  17. )
  18. self.isOver = False
  19. def run(self):
  20. kernel = np.array([ # 深度学习就是找到一个kernel是的特征对分类有效
  21. [0, -2, 0],
  22. [-2, 8, -2],
  23. [0, -2, 0]
  24. ])
  25. # 设备线程的任务,run结束,则任务结束
  26. while not self.isOver:
  27. # 反复抓取视频处理
  28. # print("设备准备工作!")
  29. status, img = self.cam.read() # 从摄像头读取图像
  30. if status:
  31. # print(img.shape)
  32. # 显示图像
  33. # 调用人工智能模块,进行图像识别(处理)
  34. # img = cv2.GaussianBlur(img, (3, 3), 2.0)
  35. img = cv2.filter2D(img, -1, kernel, delta=200.0)
  36. # 2. 发送信号
  37. self.sig_video.emit(img.tobytes(), img.shape[0], img.shape[1], img.shape[2])
  38. QThread.usleep(100000) # 1000000微秒 = 1秒
  39. def close(self):
  40. # 停止多任务
  41. self.isOver = True
  42. while self.isRunning():
  43. pass
  44. print("线程终止")
  45. # 释放设备
  46. self.cam.release()
  47. print("设备释放")