OpenCV VideoCapture.get()参数详解

本文详细介绍了OpenCV中VideoCapture.get()函数的使用,包括获取视频位置、帧率、帧宽高、编解码器等关键属性。此函数对于视频处理和分析至关重要,尤其是针对摄像头设备进行图像调整,如亮度、对比度、饱和度等。了解这些参数有助于更好地操控和理解视频流。

OpenCV VideoCapture.get()参数详解


param	define
cv2.VideoCapture.get(0)	CV_CAP_PROP_POS_MSEC     视频文件的当前位置(播放)以毫秒为单位
cv2.VideoCapture.get(1)	CV_CAP_PROP_POS_FRAMES 基于以0开始的被捕获或解码的帧索引
cv2.VideoCapture.get(2)	CV_CAP_PROP_POS_AVI_RATIO 视频文件的相对位置(播放):0=电影开始,1=影片的结尾。
cv2.VideoCapture.get(3)	CV_CAP_PROP_FRAME_WIDTH 在视频流的帧的宽度
cv2.VideoCapture.get(4)	CV_CAP_PROP_FRAME_HEIGHT 在视频流的帧的高度
cv2.VideoCapture.get(5)	CV_CAP_PROP_FPS 帧速率
cv2.VideoCapture.get(6)	CV_CAP_PROP_FOURCC 编解码的4-字符代码
cv2.VideoCapture.get(7)	CV_CAP_PROP_FRAME_COUNT 视频文件中的帧数
cv2.VideoCapture.get(8)	CV_CAP_PROP_FORMAT 返回对象的格式
cv2.VideoCapture.get(9)	CV_CAP_PROP_MODE 返回后端特定的值,该值指示当前捕获模式
cv2.VideoCapture.get(10)	 CV_CAP_PROP_BRIGHTNESS 图像的亮度(仅适用于照相机)
cv2.VideoCapture.get(11)	CV_CAP_PROP_CONTRAST 图像的对比度(仅适用于照相机)
cv2.VideoCapture.get(12)	CV_CAP_PROP_SATURATION 图像的饱和度(仅适用于照相机)
cv2.VideoCapture.get(13)	CV_CAP_PROP_HUE 色调图像(仅适用于照相机)
cv2.VideoCapture.get(14)	CV_CAP_PROP_GAIN 图像增益(仅适用于照相机)(Gain在摄影中表示白平衡提升)
cv2.VideoCapture.get(15)	CV_CAP_PROP_EXPOSURE 曝光(仅适用于照相机)
cv2.VideoCapture.get(16)	CV_CAP_PROP_CONVERT_RGB 指示是否应将图像转换为RGB布尔标志
cv2.VideoCapture.get(17)	CV_CAP_PROP_WHITE_BALANCE × 暂时不支持
cv2.VideoCapture.get(18)	CV_CAP_PROP_RECTIFICATION 立体摄像机的矫正标注(目前只有DC1394 v.2.x后端支持这个功能)

来自:https://chenlinwei.blog.youkuaiyun.com/article/details/105559536?spm=1001.2101.3001.6650.5&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-5-105559536-blog-93487629.pc_relevant_paycolumn_v3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-5-105559536-blog-93487629.pc_relevant_paycolumn_v3&utm_relevant_index=10

private boolean configureDeviceResolution(int deviceIndex) { System.err.println("configureDeviceResolution设备设置···"); // if (videoCapture == null || !videoCapture.isOpened()) { // System.err.println("[" + instanceId + "] 设备未打开,无法配置分辨率"); // return false; // } // int[][] resolutions = { { 1920, 1080 }, { 1280, 720 }, { 800, 600 }, { 640, 480 }, { -1, -1 } }; try { videoCapture.set(Videoio.CAP_PROP_FOURCC, VideoWriter.fourcc('M', 'J', 'P', 'G')); videoCapture.set(Videoio.CAP_PROP_FPS, TARGET_FPS); videoCapture.set(Videoio.CAP_PROP_BUFFERSIZE, 1); videoCapture.set(Videoio.CAP_PROP_AUTOFOCUS, 0); videoCapture.set(Videoio.CAP_PROP_AUTO_EXPOSURE, 0); double actualWidth = videoCapture.get(Videoio.CAP_PROP_FRAME_WIDTH); double actualHeight = videoCapture.get(Videoio.CAP_PROP_FRAME_HEIGHT); double actualFps = videoCapture.get(Videoio.CAP_PROP_FPS); if (actualWidth > 0 && actualHeight > 0) { deviceWidth = (int) actualWidth; deviceHeight = (int) actualHeight; // System.out.printf("[" + instanceId + "] 设备 %d 设置成功: %dx%d, FPS: %.1f%n", // deviceIndex, deviceWidth, // deviceHeight, actualFps); Mat testFrame = new Mat(); boolean readSuccess = false; for (int i = 0; i < 100; i++) { if (videoCapture.read(testFrame) && !testFrame.empty()) { readSuccess = true; Scalar meanVal = Core.mean(testFrame); double avgBrightness = (meanVal.val[0] + meanVal.val[1] + meanVal.val[2]) / 3.0; System.out.printf("[" + instanceId + "] 测试帧平均亮度: %.2f%n", avgBrightness); if (avgBrightness < 10.0) { System.out.println("[" + instanceId + "] 警告: 测试帧接近全黑"); } break; } else { System.err.println("设备读取帧失败"); Thread.sleep(50); } } System.err.println("configureDeviceResolution设备设置完成···"); if (readSuccess) { testFrame.release(); return true; } } } catch (Exception e) { System.err.printf("[" + instanceId + "] 配置 %dx%d 失败: %s%n", 1920, 1080, e.getMessage()); } return false; } 我这个VideoCapture参数设置都代表什么意思,正常的视频采集卡都应该怎么设置?
最新发布
10-27
<think>我们正在使用OpenCVVideoCapture类来配置视频采集设备(如摄像头或采集卡)。下面我将详细解释代码中设置的各个参数及其含义,并讨论一般视频采集卡的推荐设置。 ### 参数解释: 1. **`Videoio.CAP_PROP_FOURCC`**: - 设置视频编码格式(FourCC代码)。这里设置为`'M','J','P','G'`,即MJPG(Motion-JPEG)编码。这是一种常见的视频压缩格式,很多摄像头支持这种格式,它可以提供较高的图像质量,但占用带宽较大。 - 其他常见的FourCC编码有:`'Y','U','Y','V'`(YUYV,未压缩格式)或`'H','2','6','4'`(H.264,压缩格式)等。具体支持哪些格式取决于设备。 2. **`Videoio.CAP_PROP_FPS`**: - 设置采集帧率(Frames Per Second)。这里设置为常量`TARGET_FPS`(通常为30或60)。这个值表示希望设备每秒采集多少帧。注意:实际帧率可能受设备能力限制。 3. **`Videoio.CAP_PROP_BUFFERSIZE`**: - 设置内部缓存区大小。这里设置为1,表示我们希望缓存区只保留一帧。这样可以减少延迟(因为新帧会覆盖旧帧),但可能会增加掉帧的概率。对于实时应用(如视频监控、实时处理)通常希望延迟尽可能低。 4. **`Videoio.CAP_PROP_AUTOFOCUS`**: - 自动对焦控制。设置为0表示关闭自动对焦。对于固定焦距的工业摄像头或采集卡,通常不需要自动对焦。 5. **`Videoio.CAP_PROP_AUTO_EXPOSURE`**: - 自动曝光控制。设置为0表示关闭自动曝光。在稳定光照环境下,关闭自动曝光可以避免画面亮度波动。 ### 后续操作: - 代码中尝试获取实际的分辨率(`CAP_PROP_FRAME_WIDTH`和`CAP_PROP_FRAME_HEIGHT`)和帧率(`CAP_PROP_FPS`)。这些值可能与设置的值不同,因为设备可能不支持设置的分辨率或帧率,所以需要检查实际值。 - 然后,代码尝试读取100次(每次失败等待50毫秒)来获取一帧测试图像,并计算该帧的平均亮度。如果平均亮度太低(<10),则打印警告。这一步骤可以检测设备是否正常工作,以及画面是否正常(例如,镜头盖未打开会导致全黑)。 ### 一般视频采集卡的设置建议: 1. **分辨率**:通常设置成设备支持的最大分辨率(如1920x1080)或者根据应用需求调整(如处理速度要求高,可降低分辨率)。注意:设置分辨率时,最好使用设备支持的固定分辨率(可以通过设备手册查询)。代码中注释掉了一段尝试多种分辨率的代码,实际应用中可能需要这样的回退机制。 2. **帧率**:根据应用需求设置。例如,实时监控通常25-30 FPS足够,高速运动分析可能需要60 FPS或更高。注意:高分辨率和高帧率对带宽和处理能力要求更高。 3. **编码格式**:优先选择设备支持且满足应用需求的格式。MJPG格式在保证质量的同时压缩率较高,适合网络传输。如果对图像质量要求极高且带宽充足,可以选择未压缩格式(如YUYV),但数据量会很大。 4. **缓冲区大小**:实时应用建议设置为1以减少延迟,但若允许一定延迟,可以适当增大缓冲区以避免丢帧。 5. **自动参数(对焦、曝光等)**:在可控环境下(如工业检测),建议关闭自动功能,使用固定参数以保证一致性。在动态环境下(如移动机器人),可能需要开启自动曝光等。 ### 注意事项: - 不同的采集卡和摄像头支持的参数可能不同,因此设置后需要检查实际值。 - 有些参数设置可能不起作用或无效,需要查阅设备文档或通过实验确定。 ### 代码改进建议: - 分辨率设置:当前代码并没有设置分辨率,而是使用设备默认的分辨率。如果需要设置特定分辨率,可以在设置其他参数前调用: ```java videoCapture.set(Videoio.CAP_PROP_FRAME_WIDTH, targetWidth); videoCapture.set(Videoio.CAP_PROP_FRAME_HEIGHT, targetHeight); ``` 并检查实际设置的分辨率是否与预期一致。 - 错误处理:在设置参数后,最好检查每个设置是否成功(`videoCapture.set`返回布尔值)。但注意,即使返回true,设备也可能没有真正应用设置,所以获取实际值很重要。 - 重试机制:对于分辨率设置,如果目标分辨率不支持,可以尝试多个分辨率(如代码注释部分所示)。 下面是一个改进的示例代码片段,展示如何尝试多个分辨率(包括设置分辨率和检查实际分辨率): ```java int[][] resolutions = { {1920, 1080}, {1280, 720}, {800, 600}, {640, 480} }; boolean resolutionSet = false; for (int[] res : resolutions) { videoCapture.set(Videoio.CAP_PROP_FRAME_WIDTH, res[0]); videoCapture.set(Videoio.CAP_PROP_FRAME_HEIGHT, res[1]); // 给设备一点时间应用设置 Thread.sleep(100); double actualWidth = videoCapture.get(Videoio.CAP_PROP_FRAME_WIDTH); double actualHeight = videoCapture.get(Videoio.CAP_PROP_FRAME_HEIGHT); if (Math.abs(actualWidth - res[0]) < 1 && Math.abs(actualHeight - res[1]) < 1) { deviceWidth = (int) actualWidth; deviceHeight = (int) actualHeight; resolutionSet = true; break; } } if (!resolutionSet) { // 使用当前分辨率(可能是默认值) deviceWidth = (int) videoCapture.get(Videoio.CAP_PROP_FRAME_WIDTH); deviceHeight = (int) videoCapture.get(Videoio.CAP_PROP_FRAME_HEIGHT); } ``` ### 总结: 对于视频采集卡的通用设置步骤: 1. 尝试设置编码格式(如MJPG)。 2. 设置目标帧率(FPS)。 3. 根据应用需求设置缓冲区大小(实时系统设小)。 4. 关闭自动调整参数(对焦、曝光等)以保持稳定。 5. 设置分辨率(通过尝试多个分辨率实现回退)。 6. 验证设置的实际参数。 7. 测试获取帧,检查图像质量(如亮度)。 希望这些解释和建议对你有帮助。 §§相关问题§§: 1. OpenCVVideoCapture类支持哪些视频采集后端(如DirectShow、V4L2等)? 2. 如何枚举系统中所有可用的视频设备及其支持的分辨率和帧率? 3. 在设置视频采集参数时,如何判断设置是否成功? 4. 为什么在读取测试帧时使用循环并尝试多次?是否有更好的方法确保成功读取第一帧? </think>### VideoCapture 参数设置详解 以下是您代码中 OpenCV `VideoCapture` 参数设置的详细解释,以及视频采集卡通用设置建议: #### 1. **参数解析** ```java videoCapture.set(Videoio.CAP_PROP_FOURCC, VideoWriter.fourcc('M', 'J', 'P', 'G')); videoCapture.set(Videoio.CAP_PROP_FPS, TARGET_FPS); videoCapture.set(Videoio.CAP_PROP_BUFFERSIZE, 1); videoCapture.set(Videoio.CAP_PROP_AUTOFOCUS, 0); videoCapture.set(Videoio.CAP_PROP_AUTO_EXPOSURE, 0); ``` | 参数 | 含义 | 推荐值 | 说明 | |------|------|--------|------| | `CAP_PROP_FOURCC` | 视频编码格式 | `MJPG`/`YUYV` | `MJPG` 提供较好的压缩比,`YUYV` 是原始未压缩格式。采集卡通常支持这两种格式 | | `CAP_PROP_FPS` | 帧率 | 25/30/60 | 根据采集卡性能和需求设置,工业级设备通常支持 60FPS | | `CAP_PROP_BUFFERSIZE` | 缓冲区大小 | 1-3 | **关键参数**:设为 1 可减少延迟,实时系统必备设置 | | `CAP_PROP_AUTOFOCUS` | 自动对焦 | 0 (关闭) | 采集卡通常无自动对焦,工业摄像头需固定焦距 | | `CAP_PROP_AUTO_EXPOSURE` | 自动曝光 | 0 (关闭) | 稳定光照环境下建议关闭,避免画面亮度波动 | #### 2. **分辨率设置优化** 建议添加显式分辨率设置(当前代码仅获取不设置): ```java // 推荐添加分辨率设置 int targetWidth = 1920; int targetHeight = 1080; videoCapture.set(Videoio.CAP_PROP_FRAME_WIDTH, targetWidth); videoCapture.set(Videoio.CAP_PROP_FRAME_HEIGHT, targetHeight); ``` #### 3. **视频采集卡通用设置指南** ```java // 最佳实践配置示例 videoCapture.set(Videoio.CAP_PROP_FOURCC, VideoWriter.fourcc('M','J','P','G')); // MJPG压缩 videoCapture.set(Videoio.CAP_PROP_FPS, 30); videoCapture.set(Videoio.CAP_PROP_FRAME_WIDTH, 1920); // 明确设置分辨率 videoCapture.set(Videoio.CAP_PROP_FRAME_HEIGHT, 1080); videoCapture.set(Videoio.CAP_PROP_BUFFERSIZE, 1); // 最小化延迟 videoCapture.set(Videoio.CAP_PROP_AUTOFOCUS, 0); // 关闭自动对焦 videoCapture.set(Videoio.CAP_PROP_AUTO_EXPOSURE, 1); // 固定曝光值 videoCapture.set(Videoio.CAP_PROP_EXPOSURE, -6); // 手动曝光值(需设备支持) videoCapture.set(Videoio.CAP_PROP_GAIN, 0); // 关闭增益 ``` #### 4. **关键注意事项** 1. **分辨率兼容性**: 建议实现分辨率回退机制(如尝试 1920x1080 → 1280x720 → 640x480) 2. **参数验证**: ```java // 检查设置是否生效 if (Math.abs(videoCapture.get(Videoio.CAP_PROP_FPS) - TARGET_FPS) > 1) { System.err.println("帧率设置未生效!"); } ``` 3. **设备预热**: 采集卡首次启动需要 200-500ms 初始化时间,可在 `videoCapture.open()` 后添加延时 4. **亮度检测优化**: 当前代码的亮度检测逻辑合理,但建议: ```java // 添加色彩空间转换(RGB亮度更准确) Mat rgbFrame = new Mat(); Imgproc.cvtColor(testFrame, rgbFrame, Imgproc.COLOR_BGR2RGB); ``` ### 视频采集卡通用配置原则 1. **高分辨率场景**: - 首选 `MJPG` 编码(平衡画质/带宽) - 缓冲区大小=1(牺牲稳定性保实时性) - 关闭所有自动参数(曝光/白平衡) 2. **高速采集场景**: - 选用 `YUYV` 原始格式(减少编码延迟) - 降低分辨率(如 1280x720@120FPS) - 增加 USB 带宽检查(避免丢帧) 3. **工业级设备特殊设置**: ```java // 触发模式设置(外同步采集) videoCapture.set(Videoio.CAP_PROP_TRIGGER, 1); // 启用硬件触发 videoCapture.set(Videoio.CAP_PROP_TRIGGER_DELAY, 0); ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值