测试C#使用OpenCvSharp从摄像头获取图片

  OpenCvSharp也支持获取摄像头数据,不同于之前测试AForge时使用AForge控件显示摄像头数据流并从中截图图片,OpenCvSharp中显示摄像头数据流需要周期性地从摄像头中截取图片并显示在指定控件中。本文学习C#使用OpenCvSharp从摄像头获取图片的基本方式。
  新建基于.net core的Winform项目,在Nuget包管理器中搜索并安装OpenCvSharp4和OpenCvSharp4.runtime.win,也可以单独安装OpenCvSharp4.Windows。
在这里插入图片描述
  使用OpenCvSharp中的相关函数打开摄像头需要指定摄像头编号(int类型),但暂时未找到OpenCvSharp中有什么类或函数能返回计算机中所有视频设备的带编号的设备信息,AForge的FilterInfoCollection类能枚举视频输入设备,但是只有名称和MonikerString,没有设备编号。
  百度相关文章,最终在参考文献4中找到合适的代码,主要是调用参考文献5中已经封装好的SystemDeviceEnumerator类获取本地视频输入设备及编号,主要代码如下(本文测试时将参考文献5下的所有文件都引用到了项目中,也可以通过Nuget包管理器搜索并安装Hompus.VideoInputDevices包):

using var sde = new Hompus.VideoInputDevices.SystemDeviceEnumerator();

foreach (var device in sde.ListVideoInputDevice())
{
    comboCameras.Items.Add($"{device.Value},{device.Key}");
}

在这里插入图片描述
  OpenCvSharp中使用VideoCapture类读取摄像头或者视频文件数据,如果是摄像头,则在构造函数中输入摄像头编号,如果是视频文件,则在构造函数中输入视频文件地址。
  接着调用VideoCapture类的Read函数获取一帧图像,该图像为Mat类型,需要调用OpenCvSharp.Extensions. BitmapConverter.ToBitmap函数将其转换为Bitmap对象后再使用(需要安装OpenCvSharp.Extensions包),参考文献2中使用循环周期性地从摄像头中获取图片并显示在picturebox控件中,也有文章使用后台线程周期性地读取摄像头后再使用,本文中采用timer组件,定时读取摄像头图片后显示在picturebox控件中,周期设置为1秒除以摄像头的帧率(Fps)。
  此种情况下截图也比较简单,也是调用Read函数读取一帧图片即可。
  最后调用VideoCapture类的Release函数关闭摄像头或视频文件,再调用Dispose函数释放资源。

  代码比较简单,在此不再贴出,有兴趣的可以查看参考文献2,下图为程序运行效果。
在这里插入图片描述

参考文献:
[1]https://github.com/shimat/opencvsharp
[2]https://codeantenna.com/a/JbkU23NeP3
[3]https://blog.csdn.net/qq_26351861/article/details/130370934
[4]https://stackoverflow.com/questions/19258886/how-to-get-a-list-of-available-video-capture-devices/62555468#62555468
[5]https://github.com/eNeRGy164/VideoInputDevices/tree/main

  • 22
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、主要内容:OpenCV能够实现强大丰富的图像处理,但是它缺少一个能够支持它运行的界面。Csharp经过多年的发展,得益于它的“所见及所得”能力,非常方便编写界面。这两者如果能够“双剑合璧”,将有效帮助实际工作产出。本课着重推荐GOCW采用“Csharp基于CLR直接调用Opencv编写的算法库”方法,能够将最新的OpenCV技术引入进来,同时保证生成程序的最小化。    为了进一步说明Csharp和OpenCV的结合使用,首先一个较为完整的基于winform实现答题卡识别的例子,相比较之前的实现,本次进一步贴近生产实际、内涵丰富,对算法也进行了进一步提炼。同时我们对WPF下对OpenCV函数的调用、OpenCV.js的调用进行相关教授。       二、课程结构1、 EmguCV、OpenCVSharp和GOCW之间进行比较(方便代码编写、能够融入最新的算法、速度有保障、方便调试找错、拒绝黑箱化);2、视频采集模块的构建,视频采集和图像处理之间的关系;3、视频采集专用的SDK和“陪练”系统的介绍;4、在视频增强类项目中和图像处理项目中,算法的选择;5、Csharp界面设计、图片的存储和其他构建设计;6、较为完整的答题卡识别例子,兼顾界面设计和算法分析;8、WPF基于GOCW也同样可以基于GOCW实现算法调用;webForm虽然也可以通过类似方法调用,但是OpenCV.JS的方法更现代高效。9、关于软件部署的相关要点和窍门。       三、知识要点:1、基本环境构建和程序框架;2、CLR基本原理和应用方法;3、接入、采集、模拟输入;4、图像处理,通过构建循环采集图片;5、增强和实时处理;6、基于投影等技术的答题卡识别算法;7、存储、转换;8、部署交付。        课程能够帮助你掌握Csharp调用Opencv的基本方法,获得相应框架代码和指导;从而进一步提升实现“基于图像处理”的解决方案能力。  
要在Unity中使用OpenCVSharp获取摄像头视频,你需要按照以下步骤进行操作: 1. 首先,下载并安装OpenCVSharp库。你可以从OpenCVSharp的GitHub页面(https://github.com/shimat/opencvsharp)下载最新版本的库。 2. 在Unity中创建一个新的C#脚本,例如"CameraCapture.cs",并将其附加到一个GameObject上。 3. 在脚本中导入OpenCVSharp库,你可以使用以下语句: ```csharp using OpenCvSharp; ``` 4. 在脚本中编写代码来获取摄像头视频。下面是一个简单的示例: ```csharp using UnityEngine; using OpenCvSharp; public class CameraCapture : MonoBehaviour { private VideoCapture videoCapture; private Texture2D texture; void Start() { videoCapture = new VideoCapture(0); // 摄像头索引,0表示默认摄像头 if (!videoCapture.IsOpened()) { Debug.LogError("Failed to open camera!"); return; } texture = new Texture2D((int)videoCapture.FrameWidth, (int)videoCapture.FrameHeight, TextureFormat.RGBA32, false); } void Update() { Mat frame = new Mat(); videoCapture.Read(frame); if (!frame.Empty()) { // 将OpenCV的Mat转换为Unity的Texture2D texture.LoadRawTextureData(frame.Data, (int)(videoCapture.FrameWidth * videoCapture.FrameHeight * 4)); texture.Apply(); // 在Unity中显示摄像头视频 GetComponent<Renderer>().material.mainTexture = texture; } } void OnDestroy() { videoCapture.Release(); texture.Dispose(); } } ``` 在上述示例中,我们首先创建了一个VideoCapture对象来打开摄像头。然后,在Update方法中,我们使用videoCapture.Read方法读取摄像头的每一帧,并将其转换为Unity的Texture2D对象。最后,我们将Texture2D对象应用到一个渲染器的材质上,从而在Unity中显示摄像头视频。 请注意,这只是一个简单的示例,你可以根据自己的需求进行修改和扩展。 希望这能帮助到你!如果有任何问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值