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";
    
posted @ 2025-10-17 09:13  kiyte  阅读(7)  评论(0)    收藏  举报