网站首页 > 技术文章 正文
测试环境qt6.5.3 opencv4.10,以下是参考界面和主要文件的代码
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "qtimer.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
// 显示摄像头内容
void MainWindow::updateFrame() {
cv::Mat frame;
capture >> frame; // 从摄像头获取帧
if (frame.empty()) return;
// 转换成Qt可显示的格式
QImage img = QImage((const uchar*)frame.data, frame.cols, frame.rows, QImage::Format_BGR888);
ui->label->setPixmap(QPixmap::fromImage(img).scaled(ui->label->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation));
}
void MainWindow::on_openCamera_clicked()
{
capture.open(0); // 打开默认摄像头
if (!capture.isOpened()) {
QMessageBox::warning(this, "Error", "Failed to open camera.");
return;
}
timer = new QTimer(this);
connect(timer, &QTimer::timeout, this, &MainWindow::updateFrame);
timer->start(30); // 30ms更新一次
}
void MainWindow::on_closeCamera_clicked()
{
if (isRecording) {
writer.release(); // 释放视频文件
// 恢复录制按钮状态
ui->pushButton_RCD->setText("录制");
ui->pushButton_RCD->setEnabled(true);
ui->pushButton_StopRcd->setEnabled(false);
isRecording = false;
}
if (timer) {
timer->stop();
delete timer;
timer = nullptr;
}
capture.release(); // 释放摄像头
ui->label->clear();
}
void MainWindow::on_pushButton_RCD_clicked()
{
if (!capture.isOpened()) {
QMessageBox::warning(this, "Error", "Camera is not opened.");
return;
}
// 获取当前日期时间,并格式化为文件名
QString dateTime = QDateTime::currentDateTime().toString("yyyyMMdd_hhmmss");
QString filename = QDir::currentPath() + "/" + dateTime + ".avi"; // 保存到程序目录
// 设置视频编码和帧率
int width = capture.get(cv::CAP_PROP_FRAME_WIDTH);
int height = capture.get(cv::CAP_PROP_FRAME_HEIGHT);
// 打开 AVI 文件进行录制
writer.open(filename.toStdString(), cv::VideoWriter::fourcc('M', 'J', 'P', 'G'), 30, cv::Size(width, height));
if (!writer.isOpened()) {
QMessageBox::warning(this, "Error", "Failed to start video recording.");
return;
}
isRecording = true;
// 更新录制按钮状态
ui->pushButton_RCD->setText("录制中...");
ui->pushButton_RCD->setEnabled(false);
ui->pushButton_StopRcd->setEnabled(true);
// 使用 QTimer 定时捕获帧
QTimer* timer = new QTimer(this);
connect(timer, &QTimer::timeout, this, &MainWindow::recordFrame);
timer->start(33); // 约每30帧每秒 (1000ms / 30fps ≈ 33ms)
}
void MainWindow::recordFrame()
{
if (isRecording) {
cv::Mat frame;
capture >> frame; // 从摄像头捕获一帧
if (frame.empty()) {
QMessageBox::warning(this, "Error", "Failed to capture frame.");
return;
}
writer.write(frame); // 将帧写入视频文件
}
}
void MainWindow::on_pushButton_StopRcd_clicked()
{
if (isRecording) {
writer.release(); // 释放视频文件
// 恢复录制按钮状态
ui->pushButton_RCD->setText("录制");
ui->pushButton_RCD->setEnabled(true);
ui->pushButton_StopRcd->setEnabled(false);
isRecording = false;
}
}
- 上一篇: Python OpenCV读取摄像头或视频文件并播放显示
- 下一篇: 14.OpenCV-图像背景更换
猜你喜欢
- 2024-12-09 基于DeepFace和opencv,识别并分析视频中人物的面部表情
- 2024-12-09 基于OpenCV的相机捕捉视频进行人脸检测--米尔NXP i.MX93开发板
- 2024-12-09 OpenCV之形态学操作(膨胀、腐蚀、开运算、闭运算、顶帽、黑帽)
- 2024-12-09 OpenCV入门第一课
- 2024-12-09 [常用工具] OpenCV获取网络摄像头实时视频流
- 2024-12-09 用 Python 和 OpenCV 创建视频编辑器
- 2024-12-09 半小时教你手搓AI视频通话,还有懒人版代码已开源
- 2024-12-09 C# 使用OpenCV库把多张图片合成视频
- 2024-12-09 OpenCV-Python实现绿幕图像抠图
- 2024-12-09 计算机视觉系列_2、OpenCV基础讲解
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)