文章目录

  • 1.主要功能
    • 1.1主界面说明
    • 1.2回查记录界面说明
  • 2.主界面功能详解
    • 2.1 摄像头操作
    • 2.2拍照功能
    • 2.3保存图片
    • 2.4录制短视频
    • 2.5查看记录
    • 2.6新建名称
  • 3.子界面功能详解
    • 3.1 创建文件管理列表
    • 3.2单击文件
    • 3.3双击文件

这是一个使用PYQT5编写的基于openCV的图片视频采集软件。
源代码:
链接:https://pan.baidu.com/s/1BtLGvmnfWBqo3tPlRmBQNQ?pwd=74s6
提取码:74s6

csnd下载源码

1.主要功能

播放微循环显微仪的实时视频,可以保存图片及短视频到本地硬盘;保存的图片以编号+日期时间命名;回查记录时,以类似资源管理器的方式查看,可以随意比较2张图片。

1.1主界面说明

按键功能说明:
①打开视频: 视频没有打开时,按下“打开视频”,打开实时图像,按钮文字变为“关闭视频”;这时再按键本按钮,关闭实时图像。
②拍照:截取实时画面到保存图片的位置。
③保存图片:将拍照的图片以编号+时间命名后,保存到硬盘。
④查看记录:打开“回查界面”。
⑤新增编号:增加列表中没有的名字,如果已经在列表中,可以在下拉列表中选择。

1.2回查记录界面说明

回查界面的左侧是一个2级的文件管理列表,以上图为例,de01、de02等等是编号,编号的子列表是图片,图片以 编号+日期时间命名,单击图片名称时,图片出现在浏览图片;双击图片名称,图片出现在比对图片。

2.主界面功能详解

2.1 摄像头操作

实时显示摄像头影像的原理就是一秒钟内读取超过24帧的图片并显示出来。具体操作就是设定一个40ms(一秒25帧,或者更小时间)的定时器,每40ms去读一次摄像头的图片,在固定区域显示,这样就可以看到流畅的视频。

从摄像头读取一帧图像并显示的代码

    def show_pic(self):#   1. 读取一帧图像success, frame=self.cap.read()if success:#   2.获取当前时间,选择字体datet = (datetime.datetime.now()).strftime("%Y-%m-%d_%H:%M:%S")  font = cv.FONT_HERSHEY_SIMPLEX#   3.微循环仪的分辨率是600 x 480,把图片放大到 720 x 540Image = cv.resize(frame,(720,540),interpolation=cv.INTER_CUBIC)#   4.在图片中加上时间戳Image= cv.putText(Image, datet, (10, 540-10), font, 0.5,  (0, 0, 255), 1, cv.LINE_AA)show = cv.cvtColor(Image, cv.COLOR_BGR2RGB)#   5.在PYQT5显示,需要转化为QPixmap格式self.showImage = QImage(show.data, show.shape[1], show.shape[0], QImage.Format_RGB888)self.vediolabel.setPixmap(QPixmap.fromImage(self.showImage))#   6.是否记录视频if self.IsVedioRecord:#   6.1 写入帧到视频文件中self.aviout.write(frame)  #   6.2 只能记录几秒钟的时长if   time.time() > self.recordStartTime:self.IsVedioRecord = Falseself.label_tip.setText("录像结束!  "+datet)#   6.3务必释放摄像头self.aviout.release()

2.2拍照功能

按下“拍照”按键,就把当前的图像临时保存下来(还没有写入硬盘),名字是《编号+日期+时间.png》。

“拍照”按键对应的代码:

    def show_picA(self):#   1.变量self.showImage 中存放最近的图像,对此刻的图片进行临时保存,在拍照图片区域显示self.label.setPixmap(QPixmap.fromImage(self.showImage))self.recordImage = self.showImagedatet = (datetime.datetime.now()).strftime("%Y-%m-%d_%H:%M:%S") self.label_tip.setText("拍照成功!  "+datet)datet = (datetime.datetime.now()).strftime("%Y-%m-%d_%H-%M-%S") #   2.生成图片名称self.saveName = self.nameBox.currentText() +'_'+ datet + '.png'

2.3保存图片

拍照后,觉得这个图片值得保存,按下“保存图片”按键,将图片保存到硬盘。

“保存图片”按键对应的代码:

    def save_pic_to_userfolder(self):if len(self.saveName) == 0:returndatet = (datetime.datetime.now()).strftime("%Y-%m-%d_%H:%M:%S") self.label_tip.setText("图片保存成功!  "+datet)self.savePath = self.Code51_dir+'/ymtdata/'+self.nameBox.currentText()+'/'+self.saveNameself.recordImage.save(self.savePath, 'PNG')

2.4录制短视频

录制视频的代码在2.1摄像头操作,“拍视频”按键的功能是:创建视频流对象,设置录制时长,打开录制开关。

“拍视频”按键对应的代码:

    def start_vedio_record(self):#   1.设置视频编码格式FRAME_WIDTH = 640FRAME_HEIGHT = 480FPS = 10if not self.IsVedioRecord:#   2.生成需要保存的视频文件名称datet = (datetime.datetime.now()).strftime("%Y-%m-%d_%H-%M-%S") self.vedioName = self.Code51_dir+'/ymtdata/'+self.nameBox.currentText()+'/'   \+self.nameBox.currentText()+'_'+datet+'.avi'                                        #   3.创建视频流对象fourcc = cv.VideoWriter_fourcc(*'XVID')self.aviout = cv.VideoWriter(self.vedioName, fourcc, FPS, (int(FRAME_WIDTH), int(FRAME_HEIGHT)))#   4.启动录制开关self.IsVedioRecord = True#   5.设定录制时长为5秒self.recordStartTime = time.time()+5.0self.label_tip.setText("录像开始!  "+datet)pass

录制的视频实例:

hwd_2021-10-19_09-19-46

de01_2021-10-19_09-34-49

2.5查看记录

软件所在目录有个《ymtdata》,下面存放了各个编号的子文件夹,子文件夹里面存放图片或视频。“查看记录”按键是打开新的窗口(子界面),子界面的代码在下一章讲述。

“查看记录”按键对应的代码:

    def open_ViewDialog(self):  #   1.打开查看图片的子窗口,需要关闭摄像头,退出后需要手动打开if  self.IsTimerStart:self.timer_camera.stop()self.OpenCamera.setText("打开摄像头")self.IsTimerStart = False          Dlg = ViewDlg(self)#   2. 显示窗口Dlg.exec_()

2.6新建名称

新建一个编号,这个编号会出现在下拉条里面,还会创建一个子文件夹。

“新建名称”按键对应的代码:

    def input_name(self):    #1. 创建文件夹text, ok = QInputDialog.getText(self, '输入名称', '输入名称:')if ok:datet = (datetime.datetime.now()).strftime("%Y-%m-%d_%H:%M:%S") self.label_tip.setText(str(text)+datet)   self.savePath = self.Code51_dir+'/ymtdata'+'/'+str(text)#2. 判断文件夹是否已经存在,如果是,不创建if not os.path.exists(self.savePath):os.mkdir(self.savePath)    #创建 空文件夹#3. 添加到nameBoxself.nameBox.addItem(text)  #4.将 新建项 作为 选择项self.nameBox.setCurrentIndex(self.nameBox.count()-1)

3.子界面功能详解

打开子界面,会在界面的左侧生成一个2级的文件管理列表,图片显示区有左右两个区域,左边是浏览图片,单击时,图片或视频静态显示在本区域;双击文件,如果是图片文件,则在右边的对比图片区域显示,如果是视频,则在左边播放视频。

3.1 创建文件管理列表

遍历《ymtdata》下面的子文件夹和文件,结构比较单一。

def __init__(self, parent=None):super(ViewDlg, self).__init__(parent)self.setupUi(self)......#2.1    根名称root1=QTreeWidgetItem(self.tree)root1.setText(0,'图片浏览')if os.path.exists(self.rootDir):       self.CreateTree( os.listdir(self.rootDir),root1 ,self.rootDir )#只展开第一级self.tree.expandToDepth(0)  .......passdef CreateTree(self, dirs, root, path):for i in dirs:path_new = path + '/' + iif os.path.isdir(path_new):child = QTreeWidgetItem(root)child.setText(0,i)child.setIcon(0,QIcon(":/{0}.png".format("Folder")))dirs_new = os.listdir(path_new)self.CreateTree(dirs_new, child, path_new)else:if '.png' in i  or '.avi' in i:child = QTreeWidgetItem(root)child.setText(0,i)if '.png' in i:child.setIcon(0,QIcon(":/{0}.png".format("jpg32")))elif '.avi' in i:child.setIcon(0,QIcon(":/{0}.png".format("vedio32")))

3.2单击文件

    def onClicked(self, item): item=self.tree.currentItem()if '.png' in item.text(0) :     #1.如果是图片,在左侧显示self.fileName =self.rootDir +'/'+item.parent().text(0)+'/'+ item.text(0) self.label_view.setPixmap(QPixmap(self.fileName))elif '.avi' in item.text(0) :   #2. 如果是视频,只读取第一帧 显示self.fileName =self.rootDir +'/'+item.parent().text(0)+'/'+ item.text(0) self.cap = cv.VideoCapture(self.fileName)success, frame = self.cap.read()if success:Image = cv.resize(frame,(720,540),interpolation=cv.INTER_CUBIC)show = cv.cvtColor(Image, cv.COLOR_BGR2RGB)showImage = QImage(show.data, show.shape[1], show.shape[0], QImage.Format_RGB888)self.label_view.setPixmap(QPixmap.fromImage(showImage))self.cap.release()

3.3双击文件

    def onTreeDoubleClicked(self,qmodeLindex):     #对工程列表中的文件双击item=self.tree.currentItem()if '.png' in item.text(0) :     #1.如果是图片,在右侧显示self.fileName =self.rootDir +'/'+item.parent().text(0)+'/'+ item.text(0) self.label_cmp.setPixmap(QPixmap(self.fileName))elif  '.avi' in item.text(0) : #2. 如果是视频,左侧播放视频self.fileName =self.rootDir +'/'+item.parent().text(0)+'/'+ item.text(0) self.cap = cv.VideoCapture(self.fileName)#打开视频,打开定时器self.timer_camera = QTimer(self)self.timer_camera.timeout.connect(self.show_pic)self.timer_camera.start(30)self.isTimerOn=True

PYQT5+openCV项目实战:微循环仪图片、视频记录和人工对比软件(附源码)相关推荐

  1. echarts实现3D地图,轮播功能、背景图片、鼠标悬浮展示数据,附源码!

    echarts实现3D地图,轮播功能.背景图片.鼠标悬浮展示数据,附源码! 一.图片效果 二. 代码 一.图片效果 由于本地图片上传失败,无法展示完整的,不过是在此图的基础上加了轮播和底纹 二. 代码 ...

  2. Java毕设项目蛋糕店会员系统的设计与实现计算机(附源码+系统+数据库+LW)

    Java毕设项目蛋糕店会员系统的设计与实现计算机(附源码+系统+数据库+LW) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行 ...

  3. QT界面免费版开源图片转文字工具程序完整版附源码

    QT界面免费版开源图片转文字工具程序完整版附源码 需求源码的朋友请留言 操作步骤如下:

  4. Springboot实战:Springboot+Netty优雅的创建websocket客户端 (附源码下载)

    Springboot-cli 开发脚手架系列 Netty系列:Springboot+Netty优雅的创建websocket客户端 (附源码下载) 文章目录 Springboot-cli 开发脚手架系列 ...

  5. 【Opencv项目实战】目标追踪:实时追踪人工标注的多个目标

    文章目录 一.项目思路 二.问题清单 三.算法详解 3.1.定义目标追踪算法 3.2.初始化追踪器 3.3.更新目标追踪器 3.4.绘制目标矩形框 3.5.人工标注感兴趣目标 3.5.1.标注ROI区 ...

  6. 【Android App】实战项目之仿微信的私信和群聊App(附源码和演示视频 超详细必看)

    需要全部代码请点赞关注收藏后评论区留言私信~~~ 手机最开始用于通话,后来增加了短信功能,初步满足了人与人之间的沟通需求.然而短信只能发文字,于是出现了能够发图片的彩信,但不管短信还是彩信,资费都太贵 ...

  7. frame中src怎么设置成一个变量_OpenCV图像人脸检测及视频中的人脸检测(附源码)...

    文章目录 一.数据和知识准备 1. 下载HAAR与LBP数据 2. opencv相关知识 二.python+opencv实现人脸检测 1. 图像单人脸检测 2. 图像多人脸检测 3. 视频中人脸检测 ...

  8. jsp+ssm计算机毕业设计短视频文案创作平台系统【附源码】

    项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclis ...

  9. 【休闲游戏 实战1】推箱子PC端小游戏(附源码)

    游戏链接 :点击打开链接 效果图: 第100关有些难度,用了449步才过关(我用的是可跳关版的,直接玩的最后一关) 源码解读 源码一共3个文件:index.html(游戏界面加载,核心功能),js/m ...

最新文章

  1. 基于“飞桨”的深度学习智能车
  2. python大乐透2019143_[新浪彩票]老梁大乐透第19143期:前区大号走强
  3. c语言求n到m之间的素数和
  4. [JavaWeb-Servlet]Servlet_执行原理
  5. php excel 函数,php实现excel中rank函数功能的方法
  6. 【翻译】在Ext JS应用程序中构建可维护的控制器
  7. 浏览器是如何工作的系列:页面布局
  8. 每日算法系列【LeetCode 153】寻找旋转排序数组中的最小值
  9. 华为系列设备优先级总结(三)
  10. 关于MySQL latch争用深入分析与判断
  11. GDT 全局描述符表
  12. Winserver普通域用户账户无权限启动停止系统服务(启动停止按钮是灰色)
  13. IT男改变生活之12306选择上,中,下铺
  14. [网络安全自学篇] 六十六.Vulnhub靶机渗透之DC-1提权和Drupal漏洞利用(二)
  15. 我的第一篇CSDN博客
  16. 史上最全!大数据开源框架技术扫盲
  17. unity 麻将 用于打出去牌后在桌面相应的位置生成发出去的牌
  18. mysql 分钟转小时_将分钟转化为**小时**分钟,,将秒转化为**天**小时**分钟**秒...
  19. 计算机翻译语料库,人工智能与翻译
  20. Lenovo g50 如何进入到bios设置?

热门文章

  1. 基于windows的mongodb安装及mongovue可视化连接使用
  2. JAVA架构与开发(JAVA架构是需要考虑的几个问题)
  3. unity3d 工厂模型源码 带漫游示例
  4. Springboot application可以配置的选项(中文版)
  5. CCS软件报错:“第0页“.text”大小为0x1041的节的对齐/分块放置失败。”
  6. 计算机基础知识 上机 xp 试题,计算机应用基础上机指导及试题汇编
  7. Backgroundworker与Thread的区别
  8. [urlrewrite]使用urlrewrite进行地址自动重定向
  9. php轮播效果代码,CSS实现轮播图效果(附代码)
  10. 【零知ESP8266教程】快速入门8-读取模拟数值