qt6获取摄像头+抓拍功能

最近用qt6搞了个调试摄像头的软件,其ui界面设计如下:

本篇主要讲讲获取摄像头以及抓拍功能的实现,对于ui界面,注意要把中间摄像头显示控件QWidget提升为QVideoWidget,鼠标焦点在控件右键点击提升为即可,如下:

下面是摄像头获取的关键代码:

在.h文件添加:

1、摄像头所需头文件

#include <QWidget>
//#include <QStandardItemModel>
#include <QMessageBox>
#include <QDir>
#include <QTimer>
#include <QTime>
#include <QMouseEvent>
#include <QKeyEvent>

//摄像头所需头文件
#include <QCamera>
#include <QMediaDevices>
#include <QMediaCaptureSession>
#include <QMediaRecorder>
#include <QImageCapture>
#include <QVideoWidget>
#include <QVideoSink>

 2、获取摄像头函数

void getCamera();

3、摄像头相关变量

QList<QCameraDevice> list_cameras;
QScopedPointer<QCamera> my_camera;
QScopedPointer<QMediaRecorder> my_mediaRecorder;
QMediaCaptureSession my_captureSession;
QImageCapture *imageCapture;

bool camera_state;

在.cpp里添加:

1、获取摄像头函数实现,可放在构造函数里(我这里设定最多只有两个摄像头,用的两个按钮控制,如果有多个摄像头可以设定一个下拉框获取list_cameras里的设备名即可)

//获取摄像头信息
void Camera::getCamera()
{
    list_cameras = QMediaDevices::videoInputs();

    //判断设备数(设置最多两个设备,没有则不会读取设备信息)
    switch(list_cameras.length()){
    case 1:
        ui->camera1_btn->setText(list_cameras[0].description());
        break;
    case 2: 
        ui->camera1_btn->setText(list_cameras[0].description());
        ui->camera2_btn->setText(list_cameras[1].description());
        break;
    }

    if(ui->camera1_btn->text() == "暂无设备")
    {
        ui->camera1_btn->setEnabled(false);
    }
    if(ui->camera2_btn->text() == "暂无设备")
    {
        ui->camera2_btn->setEnabled(false);
    }
}

2、当获取到摄像头设备名后,点击对应按钮即可打开对应摄像头

//切换摄像头1
void Camera::on_camera1_btn_clicked()
{
    //关闭摄像头
    if(camera_state)
    {
        my_camera->stop();
        camera_state = false;   //更新摄像头状态
    }

    //新建并设置摄像头
    my_camera.reset(new QCamera(list_cameras[0],this));
    //捕获摄像头画面
    my_captureSession.setCamera(my_camera.data());
    //设置捕捉画面显示窗口
    my_captureSession.setVideoOutput(ui->display_widget);
    //启动摄像头
    my_camera->start();
    //更新摄像头状态
    camera_state = true;
    //抓拍静止图像
    imageCapture = new QImageCapture;
    my_captureSession.setImageCapture(imageCapture);
}

以下是抓拍的关键代码: 

对于抓拍功能其实比较简单,就是抓拍到的截图文件路径麻烦点,具体代码如下:

//抓拍
void Camera::on_capture_btn_clicked()
{
    QDir dir;
    //没有photograph文件夹则创建
    if(dir.exists("./photograph") == false)
    {
        dir.mkpath("./photograph");
    }

    //使用系统时间来命名图片的名称,时间是唯一的,图片名也是唯一的
    QDateTime dateTime(QDateTime::currentDateTime());
    QString time = dateTime.toString("yyyy-MM-dd-hh-mm-ss");

    //创建图片保存路径名
    QString filename = QDir::currentPath();     //获得当前路径
    filename += "/photograph/photo_";
    filename += QString("%1.jpg").arg(time);

    if(!camera_state)
    {
        QMessageBox::warning(this, "警告", tr("抓拍失败,摄像头未打开!"));
        return;
    }
    QMessageBox::information(this, "提示", tr("抓拍成功!"));
    imageCapture->captureToFile(filename);      //截图存储路径
}

点击抓拍按钮后,截图文件会保存在build目录下的photograph文件夹里,并以当前时间命名

关于摄像头简单的获取和抓拍功能暂时记录这么多,后面如果有接触更多摄像头的功能再补充吧。

  • 7
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
你可以使用Qt和OpenCV来调用摄像头。以下是一个简单的示例代码,演示如何使用Qt和OpenCV进行摄像头捕捉: ```cpp #include <QApplication> #include <QMainWindow> #include <QVBoxLayout> #include <QLabel> #include <QTimer> #include <opencv2/opencv.hpp> using namespace cv; class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr) : QMainWindow(parent) { // 创建布局和标签 QVBoxLayout *layout = new QVBoxLayout(); QLabel *label = new QLabel(this); layout->addWidget(label); // 设置布局为主窗口的中心部分 QWidget *centralWidget = new QWidget(this); centralWidget->setLayout(layout); setCentralWidget(centralWidget); // 创建定时器,用于定时更新摄像头QTimer *timer = new QTimer(this); connect(timer, &QTimer::timeout, this, &MainWindow::updateFrame); timer->start(30); // 设置时间间隔 // 打开摄像头 capture.open(0); if (!capture.isOpened()) { label->setText("无法打开摄像头"); return; } } ~MainWindow() { // 关闭摄像头 capture.release(); } private slots: void updateFrame() { Mat frame; capture >> frame; // 从摄像头获取一帧图像 // 将图像转换为Qt显示的格式 QImage image(frame.data, frame.cols, frame.rows, frame.step, QImage::Format_BGR888); // 调整图像大小以适应标签的大小 image = image.scaled(label->size(), Qt::KeepAspectRatio); // 在标签上显示图像 label->setPixmap(QPixmap::fromImage(image)); } private: VideoCapture capture; QLabel *label; }; int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); } ``` 这个示例代码创建了一个基于Qt的主窗口,该窗口使用OpenCV捕捉并显示摄像头的帧。注意,需要在项目中添加OpenCV和Qt的头文件和库。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值