测试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

相关推荐

  1. linux arm64 opencv 使用MJPG获取摄像头图片

    2023-12-29 08:06:03       38 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-29 08:06:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-29 08:06:03       106 阅读
  3. 在Django里面运行非项目文件

    2023-12-29 08:06:03       87 阅读
  4. Python语言-面向对象

    2023-12-29 08:06:03       96 阅读

热门阅读

  1. PyTorch中各种求和运算

    2023-12-29 08:06:03       60 阅读
  2. 讲解机器学习中的 K-均值聚类算法及其优缺点。

    2023-12-29 08:06:03       65 阅读
  3. 浏览器强缓存和协商缓存

    2023-12-29 08:06:03       60 阅读
  4. LeetCode [24] 两两交换链表中的节点

    2023-12-29 08:06:03       68 阅读
  5. Kotlin 派生类

    2023-12-29 08:06:03       54 阅读
  6. Go面试题学习

    2023-12-29 08:06:03       67 阅读
  7. Leetcode 509 斐波那契数

    2023-12-29 08:06:03       47 阅读
  8. 什么是ETL?

    2023-12-29 08:06:03       54 阅读
  9. 【Delphi 基础知识 4】类是如何被实例化的?

    2023-12-29 08:06:03       63 阅读