camera.py 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. from PyQt5.QtCore import QChildEvent, 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. signal_video = pyqtSignal(bytes,int,int,int) # 信号传递的数据(图像的二进制数据,字节序列(bytes),图像的高度,宽度,通道数(int))
  10. def __init__(self):
  11. super(CameraDev,self).__init__()
  12. #开始视频抓取的任务初始化
  13. #初始化摄像头
  14. self.camera = cv2.VideoCapture(0,cv2.CAP_DSHOW)
  15. # 摄像头编号从0开始 视频的处理调用DirectX 3D(DirectShow)
  16. self.isOver = False
  17. def run(self):
  18. # kernel = np.array([ # 深度学习就是找到一个kernel是的特征对分类有效
  19. # [1,0,-1],
  20. # [2,0,-2],
  21. # [1,0,-1]
  22. # ])
  23. # 设备线程的任务,run结束,则任务结束
  24. while not self.isOver:
  25. # 循环抓取视频帧
  26. # print("视频处理")
  27. status,img = self.camera.read()
  28. if status:
  29. # print(img.shape)
  30. # 显示图像
  31. # 调用人工智能模块,进行图像识别
  32. # img = cv2.GaussianBlur(img, (3,3), 1.0) # 被处理图像, 高斯模糊算子的大小
  33. img = cv2.filter2D(img,-1,kernel,delta=200.0)
  34. # 2.发送信号
  35. self.signal_video.emit(img.tobytes(),img.shape[0],img.shape[1],img.shape[2])
  36. QThread.usleep(100000) #10000000微秒 = 1s
  37. # self.camera.close() #关闭摄像头
  38. # self.camera.release() #释放设备
  39. def close(self):
  40. # 释放设备
  41. self.camera.release()
  42. # 关闭线程,停止多任务
  43. self.isOver = True
  44. while self.isRunning():
  45. pass
  46. print("线程终止")
  47. self.camera.release()
  48. print("设备释放")