QT——连接USB摄像头

该博客介绍了如何在QT环境中使用QCamera类连接USB摄像头,并通过点击按钮实现实时画面预览。首先,通过QCameraInfo获取可用摄像头列表并填充到组合框中,然后在点击开始按钮时创建QCamera实例,设置取景框为预览窗口,启动相机进行显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

功能:使用QT连接USB摄像头,点击按钮显示画面

QT += multimedia
QT += multimediawidgets

#include "camera.h"
#include "ui_camera.h"

Camera::Camera(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Camera)
{
   
    ui->setupUi(this);
    iniCamera();
}

Camera::~Camera()
{
   
    delete ui;
}

### 如何在Qt中使用OpenCV连接并操作USB摄像头 #### 初始化项目环境 为了确保能够顺利集成Qt和OpenCV来访问USB摄像头,在开始编码之前,需确认开发环境中已正确安装配置了必要的库。对于Python开发者来说,建议先升级`pip3`工具以避免后续可能出现的依赖包版本冲突问题[^3]。 ```bash $ sudo pip3 install --upgrade pip ``` #### 创建Qt工程结构 创建一个新的Qt Widgets Application项目,并向其中引入所需的外部资源。编辑`.pro`文件加入对OpenCV的支持: ```makefile QT += core gui greaterThan(QT_MAJOR_VERSION, 4): QT += widgets CONFIG += c++11 # 添加 OpenCV 库路径 INCLUDEPATH += /usr/local/include/opencv4 \ /usr/local/include/ LIBS += `pkg-config --libs opencv4` ``` #### 编写核心代码实现视频捕获功能 定义一个名为`UsbCamera`类用于封装摄像机初始化、帧读取以及图像格式转换逻辑。以下是简化版的关键部分源码片段: ```cpp #include <QImage> #include <QDebug> // 导入 OpenCV 头文件 #include <opencv2/opencv.hpp> class UsbCamera { public: explicit UsbCamera(int deviceIndex); bool isOpened() const; QImage grabFrame(); private: cv::VideoCapture cap_; }; UsbCamera::UsbCamera(int deviceIndex) : cap_(deviceIndex){ if (!cap_.isOpened()){ qWarning("Failed to open camera."); } } bool UsbCamera::isOpened() const{ return cap_.isOpened(); } QImage UsbCamera::grabFrame(){ cv::Mat frame; cap_ >> frame; if (frame.empty()) return QImage(); // 将 Mat 转换为 QImage 格式以便于 Qt 显示组件显示 cv::cvtColor(frame, frame, cv::COLOR_BGR2RGB); QImage img((const uchar*)frame.data, frame.cols, frame.rows, static_cast<int>(frame.step), QImage::Format_RGB888); return img.copy(); } ``` 此段代码实现了基本的功能需求——通过指定设备索引号实例化对象后即可获取来自选定USB摄像头的数据流;同时完成了从OpenCV内部使用的矩阵形式到适合Qt界面渲染引擎理解的画面表示之间的互转过程[^1]。 #### 构建UI展示实时画面 最后一步是在主窗口布局里嵌入一个标签控件作为视图容器,并定时请求刷新最新捕捉到的内容填充进去。假设已经有一个继承自QWidget的基础框架,则只需稍作修改如下所示: ```cpp void MainWindow::startPreview(UsbCamera *camera){ connect(&timer_, SIGNAL(timeout()), this,SLOT(updateView())); timer_.start(30); // 设置每秒约33次重绘频率 camera_ = camera; } void MainWindow::updateView(){ if(camera_->isOpened()){ ui->label->setPixmap( QPixmap::fromImage(camera_->grabFrame()).scaled(ui->label->size(), Qt::KeepAspectRatio)); }else{ qDebug()<<"Camera not opened."; } } ``` 上述方法利用信号槽机制配合计时器周期性触发更新事件,从而达到流畅播放效果的同时也兼顾到了性能优化考量[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值