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

C#--DirectShowLib 关闭自动白平衡和自动曝光时间

一、前言

    因项目需要需关闭相机自身的自动白平衡和自动曝光时间,统统设定为恒定值,开始实验了opencvCvSharp,但是不起作用,故实验了更底层的 DirectShowLib ,可成功关闭相机自带的自动白平衡和自动曝光时间,再使用 opencvCvSharp 读取摄像头

二、 代码

(1)安装 DirectShowLib 包, 直接在nuget

        简单整2按钮2文本框,用于输入需要定义的白平衡温度值和曝光时间值,曝光值-3表示是10的-3次方的意思,值越大则曝光时间越长,图像越亮;白平衡温度值是有范围,可以通过接口 int hr = videoProcAmp.GetRange(prop, out minValue, out maxValue, out steppingDelta, out defaultValue, out flags);   查询获得,温度值越大则偏暖色

(2)重点代码

using DirectShowLib;
using System.Runtime.InteropServices;
using OpenCvSharp;public class CameraManager{private IBaseFilter cameraFilter;private DsDevice cameraDevice; // DirectShow 设备public void InitializeCamera(){try{// 枚举视频输入设备var devices = DsDevice.GetDevicesOfCat(DirectShowLib.FilterCategory.VideoInputDevice);if (devices.Length == 0){Console.WriteLine("No video input devices found.");return;}// 选择第一个设备(通常是默认相机)cameraDevice = devices[0];// 使用 Moniker 来创建相机的 BaseFilter 对象object cameraObject = null;Guid iid = typeof(IBaseFilter).GUID;cameraDevice.Mon.BindToObject(null, null, ref iid, out cameraObject);cameraFilter = cameraObject as IBaseFilter;if (cameraFilter == null){Console.WriteLine("Failed to create camera filter.");return;}Console.WriteLine("Camera initialized successfully.");}catch (Exception ex){Console.WriteLine($"Error initializing camera: {ex.Message}");}}// Getter 方法获取相机的 BaseFilter 对象public IBaseFilter GetCameraFilter(){return cameraFilter;}// 释放相机资源public void CloseCamera(){if (cameraFilter != null){Marshal.ReleaseComObject(cameraFilter);cameraFilter = null;}cameraDevice = null;Console.WriteLine("Camera resources released.");}}private void button3_Click(object sender, EventArgs e) {int expos_v = int.Parse(textBox2.Text);int wb_v = int.Parse(textBox3.Text);int hr;CameraManager cameraManager = new CameraManager();cameraManager.InitializeCamera();IBaseFilter cameraFilter = cameraManager.GetCameraFilter();if (cameraFilter != null){// 在这里可以继续操作相机,比如设置属性、连接到视频源等// 例如关闭相机的自动白平衡://  IAMCameraControl cameraControl = cameraFilter as IAMCameraControl;if (cameraControl != null){hr = cameraControl.Set(DirectShowLib.CameraControlProperty.Exposure, expos_v, DirectShowLib.CameraControlFlags.Manual/* 设置关闭白平衡的值 */);DsError.ThrowExceptionForHR(hr);}IAMVideoProcAmp videoProcAmp = cameraFilter as IAMVideoProcAmp;if (videoProcAmp != null){// 获取 WhiteBalance 属性  VideoProcAmpProperty prop = VideoProcAmpProperty.WhiteBalance;// 获取当前值int minValue, maxValue, steppingDelta, defaultValue;VideoProcAmpFlags flags;// 这一句获取白平衡参数,范围2800-6500 ,默认是4600//int hr = videoProcAmp.GetRange(prop, out minValue, out maxValue, out steppingDelta, out defaultValue, out flags);  hr = videoProcAmp.Set(prop, wb_v, VideoProcAmpFlags.Manual);if (hr >= 0){textBox1.Text = "白平衡设置成功";}else{textBox1.Text = "白平衡设置失败";}}else{}}}private void button4_Click(object sender, EventArgs e){// 打开摄像头using (VideoCapture capture = new VideoCapture(0 , VideoCaptureAPIs.DSHOW )){// 设置分辨率和帧率// 检查摄像头是否成功打开if (!capture.IsOpened()){Console.WriteLine("无法打开摄像头.");return;}capture.Set(VideoCaptureProperties.FrameWidth,3840  ); // 设置宽度capture.Set(VideoCaptureProperties.FrameHeight,  2880); // 设置高度capture.Set(VideoCaptureProperties.FourCC, VideoWriter.FourCC('M', 'J', 'P', 'G'));//capture.Set(VideoCaptureProperties.Fps, 20); // 设置帧率// 获取摄像头的宽度和高度int width = (int)capture.Get(VideoCaptureProperties.FrameWidth);int height = (int)capture.Get(VideoCaptureProperties.FrameHeight);// 创建窗口以显示图像string windowName = $"sp{width}*{height}";Cv2.NamedWindow(windowName);Cv2.NamedWindow("cap");// 循环获取并显示图像int count = 0;while (true){count++;Stopwatch stopwatch = new Stopwatch();stopwatch.Start();// 从摄像头捕获一帧图像Mat frame = new Mat();capture.Read(frame);stopwatch.Stop();//textBox1.Text = $"Milliseconds elapsed: {count}";// 检查是否成功捕获图像if (frame.Empty()){Console.WriteLine("无法从摄像头捕获图像.");break;}// 在窗口中显示图像Cv2.ImShow(windowName , frame);// 等待并检测按键,按下 ESC 键退出循环int key = Cv2.WaitKey(1);if (key == 27) // ASCII码 27 表示 ESC 键break;else if (key == 32) // ASCII码 27 表示 ESC 键{Cv2.ImShow("cap", frame);Cv2.ImWrite("cap.png", frame);}}// 释放资源capture.Release();Cv2.DestroyAllWindows();}}

三、效果

白平衡温度值3000

白平衡温度值6200

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • MATLAB基础操作(二)
  • Vue Router 详解:让你的单页面应用(SPA)畅行无阻
  • Flink 实时数仓(五)【DWD 层搭建(三)交易域事实表】
  • 数据结构与算法 - 优先级队列、阻塞队列
  • 我对于内存相关的三个问题的理解和总结——内存泄漏、内存溢出、野指针
  • 宏景eHR /ajax/ajaxService SQL注入漏洞复现
  • 【时时三省】unity test 测试框架 使用 code blocks 移植
  • 如何解决C#字典的线程安全问题
  • 40.组合综合Ⅱ
  • 【JavaEE精炼宝库】 网络编程套接字——UDP业务逻辑 | TCP流套接字编程及业务逻辑实现
  • 沉浸式企业VR展厅,重塑企业形象展示方式!
  • 程序员进阶架构知识体系、开发运维工具使用、Java体系知识扩展、前后端分离流程详解、设计模式开发实例汇总专栏分享
  • ComfyUI: 报EP Error错误(onnxruntime)
  • nginx的反向代理及负载均衡
  • 软件测试基础1--功能测试
  • 07.Android之多媒体问题
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • eclipse(luna)创建web工程
  • HTML-表单
  • mysql中InnoDB引擎中页的概念
  • python学习笔记-类对象的信息
  • Rancher如何对接Ceph-RBD块存储
  • React16时代,该用什么姿势写 React ?
  • Sublime Text 2/3 绑定Eclipse快捷键
  • 规范化安全开发 KOA 手脚架
  • 基于遗传算法的优化问题求解
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 新版博客前端前瞻
  • 用element的upload组件实现多图片上传和压缩
  • 优秀架构师必须掌握的架构思维
  • ​字​节​一​面​
  • #define 用法
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • (07)Hive——窗口函数详解
  • (13):Silverlight 2 数据与通信之WebRequest
  • (13)Hive调优——动态分区导致的小文件问题
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (5)STL算法之复制
  • (floyd+补集) poj 3275
  • (Forward) Music Player: From UI Proposal to Code
  • (java)关于Thread的挂起和恢复
  • (编译到47%失败)to be deleted
  • (第30天)二叉树阶段总结
  • (多级缓存)缓存同步
  • (每日一问)操作系统:常见的 Linux 指令详解
  • (转)LINQ之路
  • **PHP二维数组遍历时同时赋值
  • **python多态
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • .NET Framework与.NET Framework SDK有什么不同?
  • .NET Micro Framework初体验
  • .net web项目 调用webService
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
  • .net 流——流的类型体系简单介绍
  • .net 验证控件和javaScript的冲突问题