Qt实现UVC摄像头捕获
一、环境配置
-
开发环境: Qt 5.15+ (MSVC 2019编译器) Windows/Linux
-
依赖配置:
# .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
}
五、性能优化
-
多线程处理:
// 使用QtConcurrent处理图像 QtConcurrent::run([this](const QImage &img){ // 后台处理图像 emit processedImage(result); });
-
硬件加速:
// 启用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
七、调试技巧
-
设备状态监控:
qDebug() << "可用设备数:" << QCameraInfo::availableCameras().count(); qDebug() << "当前分辨率:" << m_camera->viewfinderSettings().resolution();
-
帧率测试:
QElapsedTimer timer; timer.start(); // 统计每秒帧数 qDebug() << "实时帧率:" << 1000/timer.elapsed() << "FPS";