闲下来了,就趁着想写,把这个新加入的功能加进去。
终于可以去上班了,学生党可以去打工了,太不容易了~
项目代码:
代码整体更新至main分支。
添加图片与视频保存功能
1. 图片检测结果保存
直接获得当前系统时间和文件的后缀名来对检测后的文件进行命名
结果保存在output/img_output中
if not img_name:
QtWidgets.QMessageBox.warning(self, u"Warning", u"打开图片失败", buttons=QtWidgets.QMessageBox.Ok,
defaultButton=QtWidgets.QMessageBox.Ok)
else:
img = cv2.imread(img_name)
print("img_name:", img_name)
info_show = self.detect(name_list, img)
print(info_show)
# 获取当前系统时间,作为img文件名
now = time.strftime("%Y-%m-%d-%H-%M-%S", time.localtime(time.time()))
file_extension = img_name.split('.')[-1]
new_filename = now + '.' + file_extension # 获得文件后缀名
file_path = self.output_folder + 'img_output/' + new_filename
cv2.imwrite(file_path, img)
2. 保存视频和摄像头检测结果
(1)获得当前的系统时间,减少代码重复
def set_video_name_and_path(self):
# 获取当前系统时间,作为img和video的文件名
now = time.strftime("%Y-%m-%d-%H-%M-%S", time.localtime(time.time()))
# if vid_cap: # video
fps = self.cap.get(cv2.CAP_PROP_FPS)
w = int(self.cap.get(cv2.CAP_PROP_FRAME_WIDTH))
h = int(self.cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
# 视频检测结果存储位置
save_path = self.output_folder + 'video_output/' + now + '.mp4'
return fps, w, h, save_path
(2)在button_video_open与button_camera_open函数中添加视频写入资源函数
def button_video_open(self):
video_name, _ = QtWidgets.QFileDialog.getOpenFileName(self, "打开视频", "data/", "*.mp4;;*.avi;;All Files(*)")
flag = self.cap.open(video_name)
if not flag:
QtWidgets.QMessageBox.warning(self, u"Warning", u"打开视频失败", buttons=QtWidgets.QMessageBox.Ok,defaultButton=QtWidgets.QMessageBox.Ok)
else:
#-------------------------写入视频----------------------------------#
fps, w, h, save_path = self.set_video_name_and_path()
self.vid_writer = cv2.VideoWriter(save_path, cv2.VideoWriter_fourcc(*'mp4v'), fps, (w, h))
self.timer_video.start(30) # 以30ms为间隔,启动或重启定时器
# 进行视频识别时,关闭其他按键点击功能
self.ui.pushButton_video.setDisabled(True)
self.ui.pushButton_img.setDisabled(True)
self.ui.pushButton_camer.setDisabled(True)
# 打开摄像头检测
def button_camera_open(self):
print("Open camera to detect")
# 设置使用的摄像头序号,系统自带为0
camera_num = 0
# 打开摄像头
self.cap = cv2.VideoCapture(camera_num)
# 判断摄像头是否处于打开状态
bool_open = self.cap.isOpened()
if not bool_open:
QtWidgets.QMessageBox.warning(self, u"Warning", u"打开摄像头失败", buttons=QtWidgets.QMessageBox.Ok,
defaultButton=QtWidgets.QMessageBox.Ok)
else:
fps, w, h, save_path = self.set_video_name_and_path()
fps = 5 # 控制摄像头检测下的fps,Note:保存的视频,播放速度有点快,我只是粗暴的调整了FPS
self.vid_writer = cv2.VideoWriter(save_path, cv2.VideoWriter_fourcc(*'mp4v'), fps, (w, h))
self.timer_video.start(30)
self.ui.pushButton_video.setDisabled(True)
self.ui.pushButton_img.setDisabled(True)
self.ui.pushButton_camer.setDisabled(True)
(4)在show_video_frame中将检测结果写入到文件,不要忘记释放写入资源操
# 定义视频帧显示操作
def show_video_frame(self):
name_list = []
flag, img = self.cap.read()
if img is not None:
info_show = self.detect(name_list, img) # 检测结果写入到原始img上
self.vid_writer.write(img) # 检测结果写入视频
print(info_show)
# 检测信息显示在界面
self.ui.textBrowser.setText(info_show)
show = cv2.resize(img, (640, 480)) # 直接将原始img上的检测结果进行显示
self.result = cv2.cvtColor(show, cv2.COLOR_BGR2RGB)
showImage = QtGui.QImage(self.result.data, self.result.shape[1], self.result.shape[0],
QtGui.QImage.Format_RGB888)
self.ui.label.setPixmap(QtGui.QPixmap.fromImage(showImage))
self.ui.label.setScaledContents(True) # 设置图像自适应界面大小
else:
self.timer_video.stop()
# 读写结束,释放资源
self.cap.release() # 释放video_capture资源
self.vid_writer.release() # 释放video_writer资源
2.检测保存的结果
注:本来是直接在show_video_frame进行整个的视频写入操作的,即cv2.VideoWriter和write操作都在此。测试了之后,发现如此写入,会导致每一帧的检测结果被保存为一个视频文件。
还是需要在学习一下这个PyQt与Opencv结合在一起时候的相关特点。