用户数据采集实验软件

news/2025/11/15 13:03:42/文章来源:https://www.cnblogs.com/crazyMint/p/19225060

本软件用于采集用户实验过程中的视频图像。

点击查看代码
# 用于录制实验视频软件, 摄像头编号为1import sys
import cv2
import numpy as np
from PyQt5.QtWidgets import (QApplication, QLineEdit, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QFileDialog, QLabel, QFrame, QMessageBox)
from PyQt5.QtCore import QTimer, Qt
from PyQt5.QtGui import QImage, QPixmap
import os class CameraApp(QMainWindow):def __init__(self):super().__init__()self.camera = Noneself.is_camera_active = Falseself.timer = QTimer()self.recording = Falseself.video_writer = Noneself.save_path = None self.init_ui()self.connect_signals()def init_ui(self):self.setWindowTitle("摄像头控制界面")self.setGeometry(600, 200, 800, 600)# 创建中央窗口部件central_widget = QWidget()self.setCentralWidget(central_widget)# 创建主布局main_layout = QHBoxLayout(central_widget)# 左侧控制面板control_frame = QFrame()control_frame.setFrameShape(QFrame.StyledPanel)control_frame.setFixedWidth(300)control_layout = QVBoxLayout(control_frame)# 状态标签self.status_label = QLabel('请选择保存位置并开始录制')control_layout.addWidget(self.status_label)# 选择保存位置按钮self.select_button = QPushButton('选择保存位置')self.subject_id_label = QLabel('填写被试编号: ')self.subject_id = QLineEdit()self.subject_id.setPlaceholderText("如sub01")# self.subject_id.textChanged.connect(self.validate_filename)# control_layout.addRow("被试id:", self.subject_id)# 创建按钮self.open_btn = QPushButton("打开摄像头")self.start_btn = QPushButton("开始录制")        # 点击之后变成结束录制self.pause_btn = QPushButton("暂停")self.stop_btn = QPushButton("关闭摄像头")# 设置按钮样式 # 16button_style = """QPushButton {background-color: #4CAF50;border: none;color: white;padding: 10px;text-align: center;text-decoration: none;font-size: 20px;            margin: 4px 2px;border-radius: 8px;}QPushButton:hover {background-color: #45a049;}QPushButton:disabled {background-color: #cccccc;}"""self.select_button.setStyleSheet(button_style)self.select_button.clicked.connect(self.select_save_location)control_layout.addWidget(self.select_button)control_layout.addWidget(self.subject_id_label)     #被试id放在文件夹保存按钮下面control_layout.addWidget(self.subject_id)self.open_btn.setStyleSheet(button_style)self.start_btn.setStyleSheet(button_style)self.pause_btn.setStyleSheet(button_style)self.stop_btn.setStyleSheet(button_style)self.start_btn.setEnabled(False)  # 初始不可用  # 将按钮添加到控制布局control_layout.addWidget(self.open_btn)control_layout.addWidget(self.start_btn)control_layout.addWidget(self.pause_btn)control_layout.addWidget(self.stop_btn)control_layout.addStretch()  # 添加弹性空间# 右侧显示面板display_frame = QFrame()display_frame.setFrameShape(QFrame.StyledPanel)display_layout = QVBoxLayout(display_frame)# 创建显示图像的标签self.image_label = QLabel()self.image_label.setAlignment(Qt.AlignCenter)self.image_label.setMinimumSize(640, 480)self.image_label.setText("摄像头未启动")self.image_label.setStyleSheet("border: 1px solid black; background-color: #f0f0f0;")display_layout.addWidget(self.image_label)# 将左右面板添加到主布局main_layout.addWidget(control_frame)main_layout.addWidget(display_frame)# 更新按钮状态self.update_button_states()def select_save_location(self):# 弹出文件夹选择对话框folder_path = QFileDialog.getExistingDirectory(self, "选择视频保存文件夹",os.path.expanduser("~"),  # 默认从用户主目录开始QFileDialog.ShowDirsOnly | QFileDialog.DontResolveSymlinks)if folder_path:self.save_path = folder_pathself.status_label.setText(f'保存位置: {folder_path}')# self.start_btn.setEnabled(True)# 初始化摄像头# self.init_camera()def connect_signals(self):# 连接按钮信号self.open_btn.clicked.connect(self.open_camera)self.start_btn.clicked.connect(self.toggle_recording)        #开始录制self.pause_btn.clicked.connect(self.pause_camera)self.stop_btn.clicked.connect(self.stop_camera)# 连接定时器信号self.timer.timeout.connect(self.update_frame)def open_camera(self):#打开之后,右边就开始显示了self.camera = cv2.VideoCapture(1)   #0  罗技摄像头if not self.camera.isOpened():self.image_label.setText("无法访问摄像头")returnself.is_camera_active = Trueself.update_button_states()# 右边显示摄像头正在打开...self.image_label.setText("摄像头正在打开...")# 启动定时器,每30毫秒更新一帧self.timer.start(30)def update_button_states(self):# 根据摄像头状态更新按钮可用状态if not self.is_camera_active:self.open_btn.setEnabled(True)self.start_btn.setEnabled(False)         # Trueself.pause_btn.setEnabled(False)self.stop_btn.setEnabled(False)else:self.open_btn.setEnabled(False)         #打开摄像头设置为灰self.start_btn.setEnabled(True)         #录制按钮self.pause_btn.setEnabled(True)         # 暂停那妞self.stop_btn.setEnabled(True)          #结束按钮def toggle_recording(self):if not self.recording:# 开始录制self.start_recording()else:# 停止录制self.stop_recording()def start_recording(self):# 设置保存数据的文件名if not self.save_path:QMessageBox.warning(self, "警告", "请先选择保存位置")return  # 生成文件名(使用时间戳)from datetime import datetimetimestamp = datetime.now().strftime("%Y%m%d_%H%M%S")if self.subject_id.text():# print('subject id: ', self.subject_id.text())filename = f"{self.subject_id.text()}_video_{timestamp}.avi"else:filename = f"video_{timestamp}.avi"file_path = os.path.join(self.save_path, filename)# 设置视频编码器和参数frame_width = int(self.camera.get(cv2.CAP_PROP_FRAME_WIDTH))frame_height = int(self.camera.get(cv2.CAP_PROP_FRAME_HEIGHT))fps = 20.0# 创建视频写入器fourcc = cv2.VideoWriter_fourcc(*'XVID')self.video_writer = cv2.VideoWriter(file_path, fourcc, fps, (frame_width, frame_height))if not self.video_writer.isOpened():QMessageBox.critical(self, "错误", "无法创建视频文件")return self.recording = True# return True self.start_btn.setText('停止录制')self.status_label.setText(f'正在录制: {filename}')self.status_label.setStyleSheet("color: red")#font-size: 16px;def stop_recording(self):self.recording = Falseself.start_btn.setText('开始录制')self.status_label.setText(f'录制已停止,视频保存在: {self.save_path}')self.status_label.setStyleSheet("color: black")if self.video_writer:self.video_writer.release()self.video_writer = Nonedef start_camera(self):# 初始化摄像头self.camera = cv2.VideoCapture(1)   #0  罗技摄像头if not self.camera.isOpened():self.image_label.setText("无法访问摄像头")returnself.is_camera_active = Trueself.update_button_states()# 启动定时器,每30毫秒更新一帧self.timer.start(30)# 设置录制视频名称# self.start_recording()def pause_camera(self):if self.is_camera_active:if self.timer.isActive():self.timer.stop()self.pause_btn.setText("继续")else:self.timer.start(30)self.pause_btn.setText("暂停")def stop_camera(self):self.is_camera_active = Falseself.timer.stop()if self.camera:self.camera.release()self.camera = None# self.record_button.setText('开始录制')if self.recording:self.recording = Falseself.status_label.setText(f'录制已停止,视频保存在: {self.save_path}')#停止录制变回开始录制self.start_btn.setText("开始录制")if self.video_writer:self.video_writer.release()self.video_writer = Noneself.image_label.setText("摄像头已停止")# 保存数据self.update_button_states()self.pause_btn.setText("暂停")def update_frame(self):if self.camera and self.camera.isOpened():ret, frame = self.camera.read()if ret:# 将OpenCV的BGR格式转换为RGBframe = cv2.flip(frame, 1)# 如果正在录制,保存帧if self.recording and self.video_writer:self.video_writer.write(frame)frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)# 将图像转换为Qt格式h, w, ch = frame_rgb.shapebytes_per_line = ch * wqt_image = QImage(frame_rgb.data, w, h, bytes_per_line, QImage.Format_RGB888)# 缩放图像以适应标签大小scaled_pixmap = QPixmap.fromImage(qt_image).scaled(self.image_label.width(), self.image_label.height(),Qt.KeepAspectRatio)# 显示图像self.image_label.setPixmap(scaled_pixmap)else:self.image_label.setText("无法读取帧")def closeEvent(self, event):# 关闭应用程序时释放摄像头资源self.stop_camera()event.accept()if __name__ == "__main__":app = QApplication(sys.argv)window = CameraApp()window.show()sys.exit(app.exec_())

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/966222.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年出国留学咨询服务公司最新TOP5推荐:深耕辽宁服务全国,专业服务铸就留学坦途

随着留学热潮持续升温,选择靠谱的留学咨询机构成为学生和家长的重要决策。本榜单基于服务专业性、院校资源、申请成功率、客户口碑四大维度,结合行业调研数据及真实用户反馈,权威解析2025年五家顶尖出国留学咨询机构…

2025辽宁自媒体宣传公司/服务商最新TOP5榜单推荐:引领数字营销新生态

随着自媒体成为品牌触达用户的核心渠道,辽宁地区涌现出一批专业的自媒体宣传服务企业。本榜单基于技术实力、服务效果、行业适配性三大维度,结合企业规模、业务覆盖范围及客户口碑等多方面因素,综合评选出2025年自媒…

如何批量標記 bangumi 往季新番

本篇指南屬於 https://pypi.org/project/bangumi_recovery/ 操作備忘 使用場景 你可能是一個多年的追番達人,突然某一天發現了 https://bangumi.tv/ 這樣一個網站,你很希望擁有自己的一套收藏夾,但是可能會有如下問…

如何刪除清空 bangumi 時間線

本篇指南屬於 https://pypi.org/project/bangumi_recovery/ 操作備忘 使用場景 你可能基於如下場景想要刪除自己的活動記錄/時間線:賬號被他人查看,想刪除敏感活動記錄。 更換賬號或重置狀態前清理歷史。 定期清理時…

如何遷移 bangumi 賬號

本篇指南屬於 https://pypi.org/project/bangumi_recovery/ 操作備忘 使用場景 你想把一個 Bangumi 賬號的數據(收藏、評分等)遷移到另一個賬號上。傳統上你可能需要:新建或更換賬號後想複製歷史收藏 陸續把播放/觀…

免费AI论文写作工具推荐TOP6:高效生成+低查重率必备神器

2025年秋,作者因论文进展慢而焦虑,偶然听到邻桌提及AI论文智作工具,决定研究试用。随后分享免费AI论文写作工具TOP6,包括AI论文智作、通义千问等。各工具功能多样,如AI论文智作能一键搞定问卷论文、有全流程一站式…

2025辽宁视频号推广公司最新top5推荐:腾讯生态营销新势力

随着视频号成为企业私域流量运营的核心阵地,辽宁地区涌现出一批专业推广服务商。本榜单基于技术实力、服务案例、客户口碑三大维度,结合腾讯广告平台数据反馈与第三方调研机构评估,权威发布2025年度辽宁视频号推广服…

2025年靠谱的60V 电动车电池厂家推荐及选择指南

2025年靠谱的60V电动车电池厂家推荐及选择指南行业背景与市场趋势随着全球环保意识的提升和新能源政策的推动,电动车市场迎来了爆发式增长。据中国自行车协会统计,2024年中国电动自行车保有量已突破4亿辆,年产量超过…

详细介绍:机器学习高级-Chapter 04-概率论与贝叶斯分类

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年口碑好的三段力一字铰链热门厂家推荐榜单

2025年口碑好的三段力一字铰链热门厂家推荐榜单行业背景与市场趋势随着家居和商业空间对五金配件品质要求的不断提升,三段力一字铰链凭借其出色的承重能力、静音效果和耐用性,逐渐成为市场的主流选择。根据《2024年中…

【Java 详解】Mysql 索引从入门到精通 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年靠谱的工业耐磨陶瓷衬板厂家最新用户好评榜

2025年靠谱的工业耐磨陶瓷衬板厂家最新用户好评榜行业背景与市场趋势工业耐磨陶瓷衬板作为现代工业生产中的关键材料,在矿山、水泥、电力、冶金等行业中发挥着不可替代的作用。随着中国制造业转型升级步伐加快,耐磨材…

2025年知名的粉煤灰选粉机行业内口碑厂家排行榜

2025年知名的粉煤灰选粉机行业内口碑厂家排行榜行业背景与市场趋势粉煤灰选粉机作为水泥、电力、冶金等行业的关键环保设备,近年来随着国家环保政策的日益严格和"双碳"目标的推进,市场需求持续增长。据中国…

2025年评价高的青稞磨面机行业内口碑厂家排行榜

2025年评价高的青稞磨面机行业内口碑厂家排行榜行业背景与市场趋势青稞作为青藏高原特有的农作物,近年来因其丰富的营养价值和独特的口感,市场需求持续增长。据中国粮食行业协会2024年数据显示,我国青稞加工市场规模…

网络攻防实战 cheatsheet

使用 python 或 script 提升反弹 shell 交互性 许多反弹 shell 缺乏完整的终端功能,可以通过调用 Python 的 pty 模块或 script 命令来创建伪终端,支持方向键和历史命令: # 在反弹 shell 中执行以下命令 python -c …

2025年知名的深睡记忆棉枕热门厂家推荐榜单

2025年知名的深睡记忆棉枕热门厂家推荐榜单行业背景与市场趋势随着人们对睡眠质量重视程度的提升,记忆棉枕市场近年来呈现爆发式增长。根据中国睡眠研究会2024年发布的《中国睡眠健康白皮书》显示,2023年中国记忆棉枕…

2025年口碑好的铸石板衬板厂家最新热销排行

2025年口碑好的铸石板衬板厂家最新热销排行行业背景与市场趋势铸石板衬板作为工业防腐耐磨领域的关键材料,近年来随着环保要求的提高和工业设备升级需求的增长,市场规模持续扩大。据中国建筑材料联合会最新数据显示,…

2025年热门的AB枕芯厂家最新实力排行

2025年热门的AB枕芯厂家最新实力排行行业背景与市场趋势随着人们对睡眠质量要求的不断提高,枕芯市场正迎来前所未有的发展机遇。根据中国睡眠研究会最新发布的《2024-2025年中国睡眠健康产业白皮书》显示,2024年中国…

使用Tita项目管理的5大理由

在企业项目管理从 “分散管控” 向 “一体化协同” 转型的当下,Tita 项目管理软件凭借对项目管理全流程的深度优化,以五大核心优势助力企业破解项目推进难题,实现项目效率与交付质量的双重提升。1. 战略与项目深度绑…

2025年知名的舒适凝胶枕厂家选购指南与推荐

2025年知名的舒适凝胶枕厂家选购指南与推荐行业背景与市场趋势随着人们对睡眠质量要求的不断提高,凝胶枕市场近年来呈现爆发式增长。根据中国睡眠研究会2024年发布的数据显示,中国凝胶枕市场规模已达到85亿元人民币,…