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

OpenCV中VideoCapture 设置和获取摄像头参数和Qt设计UI控制界面详解代码示例

OpenCV VideoCapture 设置和获取摄像头参数

使用 OpenCV 的 cv::VideoCapture 类可以方便地获取和设置摄像头参数,如分辨率、帧率、曝光、增益、对比度等。


一、常用摄像头参数列表(ID)

参数枚举常量说明
宽度cv::CAP_PROP_FRAME_WIDTH图像帧宽
高度cv::CAP_PROP_FRAME_HEIGHT图像帧高
帧率cv::CAP_PROP_FPS每秒帧数
曝光cv::CAP_PROP_EXPOSURE曝光值(设备依赖,单位不统一)
亮度cv::CAP_PROP_BRIGHTNESS亮度值
对比度cv::CAP_PROP_CONTRAST图像对比度
饱和度cv::CAP_PROP_SATURATION色彩饱和度
色调cv::CAP_PROP_HUE色调
增益cv::CAP_PROP_GAIN图像增益(有些设备不支持)
自动曝光模式cv::CAP_PROP_AUTO_EXPOSURE自动曝光控制
自动对焦开关cv::CAP_PROP_AUTOFOCUS是否启用自动对焦
手动对焦位置cv::CAP_PROP_FOCUS手动设置焦距
帧编号(读取视频时使用)cv::CAP_PROP_POS_FRAMES当前帧号

二、获取和设置参数示例代码

#include <opencv2/opencv.hpp>
#include <iostream>int main() {cv::VideoCapture cap(0); // 打开默认摄像头(通常是设备的第一个)if (!cap.isOpened()) {std::cerr << "无法打开摄像头!" << std::endl;return -1;}// 设置摄像头参数cap.set(cv::CAP_PROP_FRAME_WIDTH, 1280);cap.set(cv::CAP_PROP_FRAME_HEIGHT, 720);cap.set(cv::CAP_PROP_FPS, 30);cap.set(cv::CAP_PROP_AUTO_EXPOSURE, 0.25);  // 关闭自动曝光(Linux下通常为0.25表示手动模式)cap.set(cv::CAP_PROP_EXPOSURE, -6);         // 设置曝光值(设备相关,单位可能是对数)cap.set(cv::CAP_PROP_GAIN, 0);              // 设置增益cap.set(cv::CAP_PROP_AUTOFOCUS, 0);         // 关闭自动对焦cap.set(cv::CAP_PROP_FOCUS, 0);             // 手动设置焦距(若支持)// 获取并打印设置结果std::cout << "Frame width: " << cap.get(cv::CAP_PROP_FRAME_WIDTH) << std::endl;std::cout << "Frame height: " << cap.get(cv::CAP_PROP_FRAME_HEIGHT) << std::endl;std::cout << "FPS: " << cap.get(cv::CAP_PROP_FPS) << std::endl;std::cout << "Exposure: " << cap.get(cv::CAP_PROP_EXPOSURE) << std::endl;std::cout << "Gain: " << cap.get(cv::CAP_PROP_GAIN) << std::endl;std::cout << "Auto Focus: " << cap.get(cv::CAP_PROP_AUTOFOCUS) << std::endl;std::cout << "Focus: " << cap.get(cv::CAP_PROP_FOCUS) << std::endl;// 显示摄像头图像cv::Mat frame;while (true) {cap >> frame;if (frame.empty()) break;cv::imshow("Camera", frame);if (cv::waitKey(1) == 27) break; // 按 ESC 退出}cap.release();cv::destroyAllWindows();return 0;
}

三、注意事项

1. 参数支持与否依赖于摄像头驱动

  • 有些摄像头(如 UVC 摄像头)支持所有常见参数;
  • 但有些摄像头参数设置会被忽略或无效;
  • 建议设置后再用 .get(...) 验证。

2. Linux 下曝光设置的特殊值(UVC)

设置含义
AUTO_EXPOSURE0.75自动模式(默认)
AUTO_EXPOSURE0.25手动曝光模式
EXPOSURE-6 ~ 0曝光时间(对数单位)

四、枚举值查询与工具支持

也可以通过如下方式列出所有参数支持情况(仅在某些系统有效,如LINUX):

v4l2-ctl --device=/dev/video0 --list-ctrls

小结

  • 使用 cv::VideoCapture::set()get() 可以设置和查询常用参数;
  • 参数支持程度取决于摄像头驱动和 OpenCV 后端(如 V4L2 / DirectShow);
  • 实际应用中建议先设置后查询,确认参数生效;
  • 对于工业相机,建议用原厂 SDK 控制参数,OpenCV 用于抓帧显示。

Qt设计UI界面综合示例

下面是一个 使用 Qt + OpenCV 构建的完整Demo框架,支持:

  • 实时摄像头图像预览;
  • GUI 控制条动态调节参数(曝光、增益、亮度、对比度、分辨率等);
  • 设置后立即生效并反映在画面中;
  • 支持 OpenCV 的所有通用 VideoCapture 参数;
  • 可构建为 Qt Widget 应用,适合工业相机控制/调试场景。

一、功能结构总览

CamControlGUI/
├── CMakeLists.txt
├── main.cpp
├── CameraControlWidget.h / .cpp
├── CameraControlWidget.ui
└── include / lib / build ...

二、关键模块代码

1. main.cpp

#include <QApplication>
#include "CameraControlWidget.h"int main(int argc, char *argv[]) {QApplication a(argc, argv);CameraControlWidget w;w.show();return a.exec();
}

2. CameraControlWidget.h

#pragma once#include <QWidget>
#include <QTimer>
#include <QImage>
#include <opencv2/opencv.hpp>QT_BEGIN_NAMESPACE
namespace Ui { class CameraControlWidget; }
QT_END_NAMESPACEclass CameraControlWidget : public QWidget {Q_OBJECTpublic:explicit CameraControlWidget(QWidget *parent = nullptr);~CameraControlWidget();private slots:void updateFrame();void onExposureChanged(int value);void onGainChanged(int value);void onBrightnessChanged(int value);void onContrastChanged(int value);private:Ui::CameraControlWidget *ui;cv::VideoCapture cap;QTimer *timer;void setupCamera();void updateCameraParams();QImage matToQImage(const cv::Mat &mat);
};

3. CameraControlWidget.cpp

#include "CameraControlWidget.h"
#include "ui_CameraControlWidget.h"CameraControlWidget::CameraControlWidget(QWidget *parent): QWidget(parent), ui(new Ui::CameraControlWidget), timer(new QTimer(this)) {ui->setupUi(this);setupCamera();connect(timer, &QTimer::timeout, this, &CameraControlWidget::updateFrame);connect(ui->sliderExposure, &QSlider::valueChanged, this, &CameraControlWidget::onExposureChanged);connect(ui->sliderGain, &QSlider::valueChanged, this, &CameraControlWidget::onGainChanged);connect(ui->sliderBrightness, &QSlider::valueChanged, this, &CameraControlWidget::onBrightnessChanged);connect(ui->sliderContrast, &QSlider::valueChanged, this, &CameraControlWidget::onContrastChanged);timer->start(30); // ~30 FPS
}CameraControlWidget::~CameraControlWidget() {cap.release();delete ui;
}void CameraControlWidget::setupCamera() {cap.open(0); // 默认摄像头cap.set(cv::CAP_PROP_FRAME_WIDTH, 1280);cap.set(cv::CAP_PROP_FRAME_HEIGHT, 720);cap.set(cv::CAP_PROP_AUTO_EXPOSURE, 0.25); // 手动曝光模式cap.set(cv::CAP_PROP_AUTOFOCUS, 0);        // 禁用自动对焦
}void CameraControlWidget::updateFrame() {cv::Mat frame;cap >> frame;if (!frame.empty()) {QImage image = matToQImage(frame);ui->labelPreview->setPixmap(QPixmap::fromImage(image).scaled(ui->labelPreview->size(), Qt::KeepAspectRatio));}
}QImage CameraControlWidget::matToQImage(const cv::Mat &mat) {if (mat.channels() == 3)return QImage(mat.data, mat.cols, mat.rows, mat.step, QImage::Format_BGR888).copy();elsereturn QImage();
}void CameraControlWidget::onExposureChanged(int value) {double exposure = static_cast<double>(value) / 10.0; // 映射范围cap.set(cv::CAP_PROP_EXPOSURE, exposure);ui->labelExposureValue->setText(QString::number(exposure));
}void CameraControlWidget::onGainChanged(int value) {cap.set(cv::CAP_PROP_GAIN, value);ui->labelGainValue->setText(QString::number(value));
}void CameraControlWidget::onBrightnessChanged(int value) {cap.set(cv::CAP_PROP_BRIGHTNESS, value);ui->labelBrightnessValue->setText(QString::number(value));
}void CameraControlWidget::onContrastChanged(int value) {cap.set(cv::CAP_PROP_CONTRAST, value);ui->labelContrastValue->setText(QString::number(value));
}

4. CameraControlWidget.ui(建议用 Qt Designer 拖拽方式在设计UI)

  • QLabel:显示摄像头画面 → labelPreview
  • QSlider + QLabel:用于曝光、增益、亮度、对比度调节 → 对应命名如 sliderExposure, labelExposureValue
  • 水平布局或网格布局组织即可

三、CMakeLists.txt 参考内容,大家可以根据自己环境配置

cmake_minimum_required(VERSION 3.10)
project(CamControlGUI)set(CMAKE_CXX_STANDARD 17)find_package(OpenCV REQUIRED)
find_package(Qt5 REQUIRED COMPONENTS Widgets)set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)include_directories(${OpenCV_INCLUDE_DIRS})add_executable(CamControlGUImain.cppCameraControlWidget.cppCameraControlWidget.hCameraControlWidget.ui
)target_link_libraries(CamControlGUI${OpenCV_LIBS}Qt5::Widgets
)

四、构建和运行

mkdir build && cd build
cmake ..
make -j
./CamControlGUI

五、可拓展功能建议

功能实现方式
保存当前参数配置使用 QSettings 读写配置文件
支持多个摄像头切换提供下拉菜单选择不同 ID
显示当前参数值在滑块旁增加 QLabel 实时显示
图像直方图 / ROI 块分析使用 OpenCV 绘图工具或嵌入 Matplotlib plot
支持工业相机 SDK(如 Daheng, Hikvision)封装原生 API 替换 VideoCapture

http://www.dtcms.com/a/283923.html

相关文章:

  • (四)OpenCV——特征点检测与匹配
  • 分布式分片策略中,分片数量的评估与选择
  • MacOS安装linux虚拟机
  • GPU的barrier
  • OpenCV中常用特征提取算法(SURF、ORB、SIFT和AKAZE)用法示例(C++和Python)
  • Linux的Ext系列文件系统
  • 一文掌握Harbor的配额管理和GC机制
  • Kubernetes架构原理与集群环境部署
  • VMware Workstation Pro 17下载安装
  • C++ AVL树实现详解:平衡二叉搜索树的原理与代码实现
  • [yotroy.cool] 记一次 spring boot 项目宝塔面板部署踩坑
  • LeetCode|Day16|387. 字符串中的第一个唯一字符|Python刷题笔记
  • 高光谱相机(Hyperspectral Camera)
  • 虚拟内存管理-抖动和工作集
  • 告别手动报表开发!描述数据维度,AI 自动生成 SQL 查询 + Java 导出接口
  • Python暑期学习笔记3
  • 100201组件拆分_编辑器-react-仿低代码平台项目
  • 使用Proxy设计模式来增强类的功能:ToastProxy和DesktopToast的设计关系
  • suricata新增Mysql告警规则处理
  • 专业职业评估工具,多维度数据分析
  • 网络安全基础操作2
  • 第十四章 gin基础
  • Spring Boot 中 META-INF 的作用与功能详解
  • 荷塘水上闯关游戏:Python OpenGL 3D游戏开发实战详解
  • 简单实现一个接口限流
  • 逆向破解京东评论加密参数|Python动态Cookie解决方案
  • 基于 Electron + Vue 3 的桌面小说写作软件架构设计
  • 共用体(联合体)
  • React Native 基础tabBar和自定义tabBar - bottom-tabs
  • Python编程进阶知识之第二课学习网络爬虫(requests)