一、系统开发
(一) 界面设计
参考:https://editor.csdn.net/md/?articleId=108977834
(二) 摄像头实时显示
1.流程
2.步骤
①创建摄像头的操作类(完成摄像头的采集功能)
功能:
- 打开摄像头
def __init__(self):
#VideoCapture类对视频或调用摄像头进行读取操作
#参数:filename:表示某个路径,传入的是一个视频,对视频进行读取
#device:摄像头的标号,0表示内置的摄像头
self.capture = cv2.VideoCapture(0,cv2.CAP_DSHOW)
#设置一个变量(多维数组)来保存摄像头读取到的数据
self.currentframe = numpy.array([])
- 获取摄像头的实时数据
#获取摄像头实时数据
def readcarmer(self):
#读取到的数据
ret,get_data = self.capture.read()
if not ret:
print("摄像头数据获取失败")
return None
return get_data
- 数据进行转换提供给界面
#将读取到的数据转换成界面能够显示的数据
def carmer_put_windown(self):
get_data = self.readcarmer()
#摄像头以BGR方式存储的,首先转换为RGB的形式
#调用cvtColor完成才是RGB的画面数据
self.currentframe = cv2.cvtColor(get_data,cv2.COLOR_BGR2RGB)
#设置宽高
#self.currentframe = cv2.cvtColor(self.currentframe,(640,480))
#获取画面的宽度和高度
height,width = self.currentframe.shape[:2]
#转换格式(界面能够显示的格式)
#先转换成QImage类型的画面,创建QImage对象,使用摄像头的画面数据
#QImage(data,width,height,format)创建
qimg = QImage(self.currentframe,width,height,QImage.Format_RGB888)
#转换成QPixmap
qpixmap = QPixmap.fromImage(qimg)
return qpixmap
②实现画面在界面上显示
该操作应该处于窗口界面类上面
def __init__(self,parent=None):
super(mywindow,self).__init__()
self.setupUi(self)#创建界面内容
#信号与槽的关联
#triggered:信号
#connect:关联(槽函数)
self.actionqid.triggered.connect(self.on_actoinqid)
"""
当某个组件设计了信号槽功能时,当信号产生,会主动调用槽函数,去完成对应 的操作
信号:当以某种特定的操作,操作这个组件时,就会主动产生信号
"""
def on_actoinqid(self):
#启动摄像头
self.carmervideo = carmer()
#启动定时器,进行定时,每隔多少时间进行一次摄像头数据的获取
self.timeshow = QTimer(self)
self.timeshow.start(50)
#50毫秒定时器启动,每50毫秒就会产生一个信号timeout
self.timeshow.timeout.connect(self.show_carmerdata)
#画面显示到界面
def show_carmerdata(self):
self.carmer = carmer()
#获取摄像头数据,转换数据
pic = self.carmer.carmer_put_windown()
#显示数据,显示画面
self.label.setPixmap(pic)
信号槽机制:信号可以关联上另一个函数,另个函数会在这个对应在产生这个对应的信号的时候就会被调用。
定时器的使用:由于单独使用一个画面显示的函数,只会获取一开始摄像头的画面数据,但是实际上是应该获取实时的画面,所以采用定时器来实现这个实时的显示。
3.效果显示
4.如何查找自己摄像头无法显示方法
① 查看自己摄像头打开是否存在问题
在摄像头类中的打开摄像头的函数中添加一个判断语句,如何打开摄像头是成功的,则在控制台输出一个提示信息;否则,表示打开摄像头的操作失败了。这样就可以对知道这里出现问题,对这里进行修改。
判断语句如下:
if self.capture.isOpened():
print("isopened")
结果如下:
②看摄像头数据读取的地方是否成功
通过看控制台是否有提示语句,来表明数据获取失败了。
③查看在数据之间转换是否有问题
主要是对几个转换语句的查看。
(三)小结
本文主要是讲解了关于对摄像头的使用,其中比较重要的概念是信号槽机制,了解到如何使用信号槽是如何进行操作的,对实现这个过程比较有帮助。完成过程,主要是在老师的讲解下完成,在有些地方表达可能不是很正确,多加包容。