当前位置: 首页 > news >正文

Qt实现UVC摄像头捕获

一、环境配置

  1. 开发环境: Qt 5.15+ (MSVC 2019编译器) Windows/Linux

  2. 依赖配置

    # .pro文件配置
    QT += multimedia multimediawidgets
    LIBS += -lQt5Multimedia
    

二、核心代码实现

1. 设备枚举与选择

// 获取所有UVC摄像头设备
QList<QCameraInfo> cameras = QCameraInfo::availableCameras();
foreach (const QCameraInfo &cameraInfo, cameras) {if (cameraInfo.deviceName().contains("UVC")) {ui->cmbCamera->addItem(cameraInfo.description(), QVariant::fromValue(cameraInfo));}
}

2. 摄像头初始化

void MainWindow::initCamera() {QCameraInfo cameraInfo = ui->cmbCamera->currentData().value<QCameraInfo>();m_camera = new QCamera(cameraInfo, this);// 配置视频格式QCameraViewfinderSettings settings;settings.setResolution(1280, 720);settings.setPixelFormat(QVideoFrame::Format_YUYV);m_camera->setViewfinderSettings(settings);// 设置预览控件m_viewfinder = new QCameraViewfinder(this);m_camera->setViewfinder(m_viewfinder);ui->layout->addWidget(m_viewfinder);connect(m_camera, &QCamera::errorOccurred, this, &MainWindow::handleCameraError);
}

3. 视频帧捕获

// 自定义视频表面类
class VideoSurface : public QAbstractVideoSurface {
public:explicit VideoSurface(QWidget *parent = nullptr) : QAbstractVideoSurface(parent) {}QList<QVideoFrame::PixelFormat> supportedPixelFormats(QAbstractVideoBuffer::HandleType handleType = QAbstractVideoBuffer::NoHandle) const override {return {QVideoFrame::Format_RGB32, QVideoFrame::Format_YUYV};}bool present(const QVideoFrame &frame) override {if (frame.isValid()) {QImage image(frame.bits(), frame.width(), frame.height(), QVideoFrame::imageFormatFromPixelFormat(frame.pixelFormat()));emit frameCaptured(image);  // 发射信号传递QImage}return true;}signals:void frameCaptured(const QImage &);
};// 在MainWindow中使用
VideoSurface *surface = new VideoSurface(this);
m_camera->setViewfinder(surface);
connect(surface, &VideoSurface::frameCaptured, this, &MainWindow::processFrame);

4. 图像处理与保存

void MainWindow::processFrame(const QImage &image) {ui->imageLabel->setPixmap(QPixmap::fromImage(image));// 保存图像示例static int frameCount = 0;if (ui->chkSave->isChecked()) {QString fileName = QString("frame_%1.jpg").arg(++frameCount);image.save(fileName, "JPG", 90);}
}

三、高级功能实现

1. 多格式支持

// 查询摄像头支持的格式
QCameraViewfinderSettings settings = m_camera->viewfinderSettings();
QList<QSize> resolutions = m_camera->supportedViewfinderResolutions();
QList<QVideoFrame::PixelFormat> formats = m_camera->supportedViewfinderPixelFormats();

2. 曝光控制

// 自动曝光设置
m_camera->exposure()->setAutoExposure(QCameraExposure::ExposureAuto);// 手动调整曝光值
m_camera->exposure()->setManualExposure(0.5f);

3. 实时滤镜

// 添加色度偏移效果
QVideoProbe *probe = new QVideoProbe(this);
probe->setSource(m_camera);
connect(probe, &QVideoProbe::videoFrameProbed, [](const QVideoFrame &frame) {QVideoFrame filteredFrame(frame);// 实现自定义滤镜算法return filteredFrame;
});

四、错误处理

void MainWindow::handleCameraError(QCamera::Error error) {QMessageBox::critical(this, "错误", QString("摄像头错误: %1\n错误描述: %2").arg(error).arg(m_camera->errorString()));
}// 权限检查
void MainWindow::checkPermissions() {#if defined(Q_OS_WIN)// Windows权限检查#elif defined(Q_OS_LINUX)if(!QFile::exists("/dev/video0")) {QMessageBox::warning(this, "警告", "未检测到UVC设备");}#endif
}

五、性能优化

  1. 多线程处理

    // 使用QtConcurrent处理图像
    QtConcurrent::run([this](const QImage &img){// 后台处理图像emit processedImage(result);
    });
    
  2. 硬件加速

    // 启用GPU加速
    QSurfaceFormat format;
    format.setRenderableType(QSurfaceFormat::OpenGL);
    QSurfaceFormat::setDefaultFormat(format);
    

六、完整工程结构

UVC_Capture/
├── Src/
│   ├── main.cpp
│   ├── mainwindow.cpp
│   └── videoprocessor.cpp
├── Res/
│   └── mainwindow.ui
├── UVC_Capture.pro
└── CMakeLists.txt

参考代码 QT 捕获UVC摄像头,枚举摄像头设备,预览显示图像,拍照等 www.youwenfan.com/contentcnj/69957.html

七、调试技巧

  1. 设备状态监控

    qDebug() << "可用设备数:" << QCameraInfo::availableCameras().count();
    qDebug() << "当前分辨率:" << m_camera->viewfinderSettings().resolution();
    
  2. 帧率测试

    QElapsedTimer timer;
    timer.start();
    // 统计每秒帧数
    qDebug() << "实时帧率:" << 1000/timer.elapsed() << "FPS";
    
http://www.hskmm.com/?act=detail&tid=32746

相关文章:

  • 2025年10月17日信息公布:太阳能路灯厂家最新推荐榜~覆盖乡村户外、单臂双臂、农村及5-8米LED款,精选优质路灯企业
  • 基于Java+Springboot+Vue开发的新闻管理系统源码+运行步骤
  • Linux 环境变量与软件安装
  • 2025最新超详细 VMware 17虚拟机下载安装教程(附安装包下载)保姆级详细步骤
  • 网络分析与数据可视化工具Gephi 0.9.2 下载安装教程全流程(Gephi图文安装教程)
  • 2025 涂料供应厂家最新推荐榜:权威品牌测评 + 选购指南,家装工程选品必看
  • 2025 年中走丝线切割源头厂家最新推荐排行榜发布,解读优质厂家技术亮点与选择攻略伺服/高效/自动中走丝线切割厂家推荐
  • 2024浙江省省赛决赛wp
  • 【解决办法】pytorch OSError: [WinError 1114] 动态链接库(DLL)初始化例程失败”
  • 23省赛初赛
  • 2025年苏州保洁服务公司最新权威推荐榜:专业家政与深度清洁口碑优选,覆盖日常保洁、开荒保洁、深度清洁及企业保洁服务
  • 2025 年快速退火炉优质厂家最新推荐榜单:真空 / 半导体 / 晶圆 / 高温 / 桌面 / 半自动 / 全自动 / 芯片 / 硅片 / RTP 设备企业权威评选
  • 2025 年油罐厂家最新推荐榜:sf 双层 / 加油站 / 化工 / 不锈钢 / 地埋 / 卧式 / 立式油罐优质厂商权威盘点,帮您避开选择误区精准选品
  • 2025 年立体画厂家最新推荐榜单:涵盖 3D 光栅立体画、立体光栅卡、3D 装饰立体画、三维立体画,助企业与消费者精准挑选优质品牌
  • 2025 最新高低温试验箱厂家推荐榜:优质厂家推荐,含恒温恒湿设备供应商核心实力解析
  • Luogu P10027 梦境世界 题解 [ 蓝 ] [ 多维 DP ]
  • winserver文件备份到minio
  • 特殊函数
  • 教你把未分配的磁盘合并到C盘或者D盘?如何把未分配的硬盘空间分配到另一个磁盘?Windows 11,如何将未分配的磁盘分配给 C 盘?怎么把未分配的磁盘合并到d盘
  • 项目ai拷打
  • 混合(ZR 二十联测 A + MX 炼石 ABC)
  • Qt项目作品在苹果macos上编译运行效果/视频监控系统/物联网平台等
  • 电脑硬盘中的文件怎么搜索?电脑文件搜索太慢怎么办?
  • 2025年靠谱的风机/离心风机/轴流风机生产企业排行榜-江苏中南鼓风机有限公司
  • 2025年行业内游乐设施/过山车游乐设施权威榜单厂家-河北天鸿游乐设备
  • 机器学习技术助力美国西海岸地震预警系统升级
  • 2025年口碑好的挤浆机/单螺旋挤浆机TOP品牌推荐厂家-滕州市建兴机械有限公司
  • 2025年市场课桌椅/钢塑课桌椅最新TOP排名厂家-江西华聚智能家具集团有限公司
  • 2025年口碑好的垃圾袋/医疗垃圾袋排名推荐生产厂家-厦门市万塑环保材料有限公司
  • 深入理解 PHP-FPM 的最佳配置