C#(Winform)通过添加AForge添加并使用系统摄像机

先展示效果 

AForge介绍

AForge是一个专门为开发者研究者基于C#框架设计的, 也是NET平台下的开源计算机视觉和人工智能库
它提供了许多常用的图像处理视频处理算法、机器学习和神经网络模型,并且具有高效、易用、稳定等特点。

 AForge主要包括:

计算机视觉与人工智能,图像处理,神经网络,遗传算法,机器学习,模糊系统,机器人控制等

  • AForge.Imaging ——日常的图像处理和过滤器
  • AForge.Vision —— 计算机视觉应用类库
  • AForge.Neuro —— 神经网络计算库AForge.Genetic -进化算法编程库
  • AForge. MachineLearning —— 机械学习类库
  • AForge. Robotics —— 提供一些机器学习的工具类库
  • AForge.Video —— 一系列的视频处理类库
  • AForge.Fuzzy —— 模糊推理系统类库
  • AForge.Controls —— 图像, 三维, 图表显示控件

AForge的使用方向 

1. 基于符号识别的3D显示增强技术

2. 基于模糊系统的自动导航

3. 运动检测

4. 2D增强技术

5. 计算机视觉与人工智能

6. 模拟识别

7. 神经网络

8. 图像处理

9. 遗传算法

10. 机器学习

11. 机器人控制等等

 AForge的安装方法

1.右键项目名

2.打开 "管理 NuGet程序包"

3.点击浏览 在浏览上输入 "AForge",并下载

注意:作者一般都是 aforge.net

4.全部下载之后,他会在你的winfrom的左边框会自动显示 

一、下面是我做的一个相机拍摄小项目

 

1.我们先把页面搭好, 上面的字都是lable弄的不是textbox

控件: label  button  comboBox  picture  timer   VideoSourcePlayer

注意:  VideoSourcePlayer 是 我们下载的那个控件里的(AForge.NET)

 2. 拉一个label , 右下角属性  

label 的 属性

  • Auto ==>False     
  • BorderStyle ==> Fixed3D   
  • TextAlign==>MiddleCenter  
  • ForeColor==>Red   
  • BackGround==>Black

3.最上面时间的显示

注意:这里是timer的控件一个点击事件

timer的Enable  属性  修改成  True

 #region 显示实时时间private void timer1_Tick(object sender, EventArgs e){DateTime dt=DateTime.Now;this.txtYear.Text = dt.Year.ToString();this.txtMonth.Text = dt.Month.ToString();this.txtDay.Text = dt.Day.ToString();this.txtTime.Text=dt.ToLongTimeString();string week = "";switch(dt.DayOfWeek){case DayOfWeek.Sunday:week = "日";break;case DayOfWeek.Monday:week = "一";break;case DayOfWeek.Tuesday:week = "二";break;case DayOfWeek.Wednesday:week = "三";break;case DayOfWeek.Thursday:week = "四";break;case DayOfWeek.Friday:week = "五";break;case DayOfWeek.Saturday:week = "六";break;default:break;}this.txtWeek.Text = week;}#endregion

4.我们要把最基本的 给完善了,把该定义的全部完成,窗体加载我们要提前实例化相机

  private FilterInfoCollection filterInfoCollection;  //摄像头设备集合private VideoCaptureDevice videoCapture;//捕捉设备源private Bitmap image=null; //设置图片接收的int Isopen = 0;  private void Form1_Load(object sender, EventArgs e){filterInfoCollection = new FilterInfoCollection(FilterCategory.VideoInputDevice);//MessageBox.Show($"检测到了{filterInfoCollection.Count.ToString()}个摄像头");//这下面的for循环是为了检测电脑连接几个相机 ,来吧相机数量写在combobox控件下for(int i = 0; i < filterInfoCollection.Count; i++){comboBox1.Items.Add($"摄像头{i}");}}

5.下拉框(ComboBox)索引选择改变

 CloseCamera(); //这个先提前关闭相机, 下面有介绍if (comboBox1.SelectedIndex == 0 && filterInfoCollection.Count > 0){videoCapture = new VideoCaptureDevice(filterInfoCollection[0].MonikerString);}else if (comboBox1.SelectedIndex == 1 && filterInfoCollection.Count > 1){videoCapture = new VideoCaptureDevice(filterInfoCollection[0].MonikerString);}else{MessageBox.Show("摄像头选择有误", "错误提示");return;}videoSourcePlayer1.VideoSource=videoCapture;videoSourcePlayer1.Start();

二、简化封装:相机关闭,相机连接(实时显示),保存图片

1.连接相机

  #region 连接相机private void ConnCamera(){if(filterInfoCollection.Count>0){ videoCapture = new VideoCaptureDevice(filterInfoCollection[0].MonikerString);videoSourcePlayer1.VideoSource= videoCapture;videoSourcePlayer1.Start();}}#endregion

2.关闭相机

 #region 关闭相机private void CloseCamera(){if(videoSourcePlayer1.VideoSource!=null){videoSourcePlayer1.SignalToStop();videoSourcePlayer1.VideoSource.Stop();videoSourcePlayer1.VideoSource = null;}}#endregion

3.保存图片

 #region 保存图片private void SaveImage(){var date = DateTime.Now.ToString("yyyy-MM-dd");date += "-" + DateTime.Now.TimeOfDay.ToString("hhmmss");if(!Directory.Exists("D:\\Saved_Pictures")){Directory.CreateDirectory("D:\\Saved_Pictures");}image.Save(string.Format("D:\\Saved_Pictures\\" + date + ".jpg", date), System.Drawing.Imaging.ImageFormat.Png);}#endregion

三、实现相机拍照,相机实时显示(打开),图片保存功能,窗体关闭

1.打开相机(实时显示)

 private void takeCamera_Click(object sender, EventArgs e){if(((uint)filterInfoCollection.Count)==0){MessageBox.Show("检测不到你的摄像头", "错误提示");}else{Isopen++;if(Isopen%2!=0){takeCamera.Text = "关闭摄像头";ConnCamera();}else if(Isopen%2==0){takeCamera.Text = "打开摄像头";CloseCamera();}}}

2.相机拍照

 private void takephoto_Click(object sender, EventArgs e){image=videoSourcePlayer1.GetCurrentVideoFrame();pictureBox1.SizeMode=PictureBoxSizeMode.Zoom;pictureBox1.Image= image;}

3.图片保存

   private void SavePicture_Click(object sender, EventArgs e){if(pictureBox1.Image!=null){SaveImage();}else{MessageBox.Show("请先进行拍照", "相机拍照");}}

4.窗体关闭

    private void Form1_FormClosing(object sender, FormClosingEventArgs e){if(MessageBox.Show("将要关闭窗口,是否继续?", "询问", MessageBoxButtons.YesNo) == DialogResult.Yes){e.Cancel=false;CloseCamera();Application.Exit();}else{e.Cancel = true;}}
}

补充: 窗体的关闭方法;窗体跳转文件夹

1.关闭窗体的多种方法

1. this.Close() ;

只是关闭当前窗口,如果不是主窗体的话,它后台还会再运行,是无法推出主程序的。

2.Application.Exit();

强制所有消息中止,退出所有的窗口,但是有托管线程,也无法干净退出

3.Applicat.ExitThread();

强制中止调用线程上的所有消息,同样面临其他线程无法正确退出问题

4.System.Environment.Exit(0);

这是彻底的强制退出,能把程序结束很干净

2.跳转功能

由于一般程序保存图片后都会有个跳转功能,这个我感觉保存后跳转,他就不是一个功能了,这里给大家写一下怎么去跳转。

 System.Diagnostics.Process.Start("D:\\Saved_Pictures");

注意: 括号里面是路径 

四、完结:代码展示和结果

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using AForge.Video.DirectShow;namespace Camera
{public partial class Form1 : Form{public Form1(){InitializeComponent();}private FilterInfoCollection filterInfoCollection;  //摄像头设备集合private VideoCaptureDevice videoCapture;//捕捉设备源private Bitmap image=null;int Isopen = 0;#region 显示实时时间private void timer1_Tick(object sender, EventArgs e){DateTime dt=DateTime.Now;this.txtYear.Text = dt.Year.ToString();this.txtMonth.Text = dt.Month.ToString();this.txtDay.Text = dt.Day.ToString();this.txtTime.Text=dt.ToLongTimeString();string week = "";switch(dt.DayOfWeek){case DayOfWeek.Sunday:week = "日";break;case DayOfWeek.Monday:week = "一";break;case DayOfWeek.Tuesday:week = "二";break;case DayOfWeek.Wednesday:week = "三";break;case DayOfWeek.Thursday:week = "四";break;case DayOfWeek.Friday:week = "五";break;case DayOfWeek.Saturday:week = "六";break;default:break;}this.txtWeek.Text = week;}#endregionprivate void Form1_Load(object sender, EventArgs e){filterInfoCollection = new FilterInfoCollection(FilterCategory.VideoInputDevice);//MessageBox.Show($"检测到了{filterInfoCollection.Count.ToString()}个摄像头");for(int i = 0; i < filterInfoCollection.Count; i++){comboBox1.Items.Add($"摄像头{i}");}System.Diagnostics.Process.Start("D:\\Saved_Pictures");}private void comboBox1_SelectedIndexChanged(object sender, EventArgs e){CloseCamera();if (comboBox1.SelectedIndex == 0 && filterInfoCollection.Count > 0){videoCapture = new VideoCaptureDevice(filterInfoCollection[0].MonikerString);}else if (comboBox1.SelectedIndex == 1 && filterInfoCollection.Count > 1){videoCapture = new VideoCaptureDevice(filterInfoCollection[0].MonikerString);}else{MessageBox.Show("摄像头选择有误", "错误提示");return;}videoSourcePlayer1.VideoSource=videoCapture;videoSourcePlayer1.Start();}#region 关闭相机private void CloseCamera(){if(videoSourcePlayer1.VideoSource!=null){videoSourcePlayer1.SignalToStop();videoSourcePlayer1.VideoSource.Stop();videoSourcePlayer1.VideoSource = null;}}#endregion#region 连接相机private void ConnCamera(){if(filterInfoCollection.Count>0){ videoCapture = new VideoCaptureDevice(filterInfoCollection[0].MonikerString);videoSourcePlayer1.VideoSource= videoCapture;videoSourcePlayer1.Start();}}#endregion#region 保存图片private void SaveImage(){var date = DateTime.Now.ToString("yyyy-MM-dd");date += "-" + DateTime.Now.TimeOfDay.ToString("hhmmss");if(!Directory.Exists("D:\\Saved_Pictures")){Directory.CreateDirectory("D:\\Saved_Pictures");}image.Save(string.Format("D:\\Saved_Pictures\\" + date + ".jpg", date), System.Drawing.Imaging.ImageFormat.Png);}#endregionprivate void takeCamera_Click(object sender, EventArgs e){if(((uint)filterInfoCollection.Count)==0){MessageBox.Show("检测不到你的摄像头", "错误提示");}else{Isopen++;if(Isopen%2!=0){takeCamera.Text = "关闭摄像头";ConnCamera();}else if(Isopen%2==0){takeCamera.Text = "打开摄像头";CloseCamera();}}}private void takephoto_Click(object sender, EventArgs e){image=videoSourcePlayer1.GetCurrentVideoFrame();pictureBox1.SizeMode=PictureBoxSizeMode.Zoom;pictureBox1.Image= image;}private void SavePicture_Click(object sender, EventArgs e){if(pictureBox1.Image!=null){SaveImage();}else{MessageBox.Show("请先进行拍照", "相机拍照");}}private void Form1_FormClosing(object sender, FormClosingEventArgs e){if(MessageBox.Show("将要关闭窗口,是否继续?", "询问", MessageBoxButtons.YesNo) == DialogResult.Yes){e.Cancel=false;CloseCamera();Application.Exit();}else{e.Cancel = true;}}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/17099.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

迅为RK3568开发板篇OpenHarmony实操HDF驱动配置LED-LED测试

将编译好的镜像全部进行烧写&#xff0c;镜像在源码根目录 out/rk3568/packages/phone/images/目录下。 烧写完成之后&#xff0c;在调试串口查看打印日志&#xff0c;如下图所示&#xff1a; 然后打开 hdc 工具&#xff0c;运行测试程序&#xff0c;输入“led_test 1”&…

在VS2022中配置DirectX12环境,并显示显示一个窗口

1.创建空项目并配置项目&#xff1a; 1.打开VS2022,创建C项目中的空项目 2.新建一个Main.cpp文件 3.配置项目 将属性页的C/C项中的语言栏的符合模式设置为否 再将链接器中的系统栏的子系统设置为窗口 设置完成&#xff01; 2.创建一个Windows窗口&#xff1a; 代码&#…

AI前端开发:蓬勃发展的机遇与挑战

人工智能&#xff08;AI&#xff09;领域的飞速发展&#xff0c;正深刻地改变着我们的生活方式&#xff0c;也为技术人才&#xff0c;特别是AI代码生成领域的专业人士&#xff0c;带来了前所未有的机遇。而作为AI应用与用户之间桥梁的前端开发&#xff0c;其重要性更是日益凸显…

DeepSeek+即梦 做AI视频

DeepSeek做AI视频 制作流程第一步&#xff1a;DeepSeek 生成视频脚本和分镜 第二步&#xff1a;生成分镜图片绘画提示词第三步&#xff1a;生成分镜图片第四步&#xff1a;使用可灵 AI 工具&#xff0c;将生成的图片转成视频。第五步&#xff1a;剪映成短视频 DeepSeek 真的强&…

数组练习(深入理解、实践数组)

1.练习1&#xff1a;多个字符从两端移动&#xff0c;向中间汇聚 编写代码&#xff0c;演示多个字符从两端移动&#xff0c;向中间汇聚 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<string.h> int main() {//解题思路&#xff1a;//根据题意再…

学习threejs,使用HemisphereLight半球光

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.HemisphereLight 二、…

vue项目使用vite和vue-router实现history路由模式空白页以及404问题

开发项目的时候&#xff0c;我们一般都会使用路由&#xff0c;但是使用hash路由还是history路由成为了两种选择&#xff0c;因为hash路由在url中带有#号&#xff0c;history没有带#号&#xff0c;看起来更加自然美观。但是hash速度更快而且更通用&#xff0c;history需要配置很…

Fiori APP配置中的Semantic object 小bug

在配置自开发程序的Fiori Tile时&#xff0c;需要填入Semantic Object。正常来说&#xff0c;是需要通过事务代码/N/UI2/SEMOBJ来提前新建的。 但是在S4 2022中&#xff0c;似乎存在一个bug&#xff0c;即无需新建也能输入自定义的Semantic Object。 如下&#xff0c;当我们任…

芯片设计企业的IT支撑点

对于一个芯片设计企业&#xff0c;需要怎么样的IT支撑&#xff0c;这看起来并不是那么重要&#xff0c;并不影响芯片企业是否取得成功&#xff0c;但真正进入这个行业&#xff0c;你会发现&#xff0c;这里还是有一些门道的。 实际上&#xff0c;芯片设计企业对于IT的依赖很重&…

生成对抗网络入门:Mnist手写数字生成

本文为为&#x1f517;365天深度学习训练营内部文章 原作者&#xff1a;K同学啊 一 理论基础 生成对抗网络(Generative Adversarial Networks,GAN)是近年来深度学习领域的一个热点方向。 GAN并不指代某一个具体的神经网络&#xff0c;而是指一类基于博弈思想而设计的神经网络。…

22.4、Web应用漏洞分析与防护

目录 Web应用安全概述DWASP Top 10Web应用漏洞防护 - 跨站脚本攻击XSSWeb应用漏洞防护 - SQL注入Web应用漏洞防护 - 文件上传漏洞Web应用漏洞防护 - 跨站脚本攻击XSS Web应用安全概述 技术安全漏洞&#xff0c;主要是因为技术处理不当而产生的安全隐患&#xff0c;比如SQL注入…

软件的生命周期和需求

什么是软件的生命周期? 定义(描述) --> 创建 --> 使用 --> 销毁 (这一整个过程就是事物的生命周期) 生命周期 那么软件的生命周期又分为哪些呢? 一共分为十步: 可行性研究: 通过分析软件开发要求,确定软件项目的性质、目标和规模,得出可行性研究报告,如果可行性研…

深入理解DeepSeek与企业实践(二):32B多卡推理的原理、硬件散热与性能实测

前言 在《深入理解 DeepSeek 与企业实践&#xff08;一&#xff09;&#xff1a;蒸馏、部署与评测》文章中&#xff0c;我们详细介绍了深度模型的蒸馏、量化技术&#xff0c;以及 7B 模型的部署基础&#xff0c;通常单张 GPU 显存即可满足7B模型完整参数的运行需求。然而&…

Java 字符编码与解码:深入理解 Charset 类

目录 引言 一、什么是字符集&#xff08;Charset&#xff09;&#xff1f; 二、Charset 类的核心功能 1. 获取字符集实例 2. 编码与解码 示例1&#xff1a;字符串转字节数组 示例2&#xff1a;处理不同字符集的乱码问题 3. 字符集检测与支持 三、Charset 类的常用方法…

Redis7.0八种数据结构底层原理

导读 本文介绍redis应用数据结构与物理存储结构,共八种应用数据结构和 一. 内部数据结构 1. sds sds是redis自己设计的字符串结构有以下特点: jemalloc内存管理预分配冗余空间二进制安全(c原生使用\0作为结尾标识,所以无法直接存储\0)动态计数类型(根据字符串长度动态选择…

本地Deepseek-r1:7b模型集成到Google网页中对话

本地Deepseek-r1:7b网页对话 基于上一篇本地部署的Deepseek-r1:7b&#xff0c;使用黑窗口对话不方便&#xff0c;现在将本地模型通过插件集成到Google浏览器中 安装Google插件 在Chrome应用商店中搜索page assis 直接添加至Chrome 修改一下语言 RAG设置本地运行的模型&#…

【设计模式】【行为型模式】观察者模式(Observer)

&#x1f44b;hi&#xff0c;我不是一名外包公司的员工&#xff0c;也不会偷吃茶水间的零食&#xff0c;我的梦想是能写高端CRUD &#x1f525; 2025本人正在沉淀中… 博客更新速度 &#x1f44d; 欢迎点赞、收藏、关注&#xff0c;跟上我的更新节奏 &#x1f3b5; 当你的天空突…

gitlab Webhook 配置jenkins时“触发远程构建 (例如,使用脚本)”报错

报错信息&#xff1a; <html> <head> <meta http-equiv"Content-Type" content"text/html;charsetISO-8859-1"/> <title>Error 403 No valid crumb was included in the request</title> </head> <body><h2…

AI赋能前端开发:薪资潜力无限的未来

在当今竞争激烈的就业市场&#xff0c;掌握AI写代码工具等AI技能已经成为许多专业人士提升竞争力的关键。尤其在快速发展的前端开发领域&#xff0c;AI的应用更是日新月异&#xff0c;为开发者带来了前所未有的机遇。高薪职位对熟练掌握AI技术的前端开发者的需求与日俱增&#…

外包干了4年,技术退步太明显了。。。。。

先说一下自己的情况&#xff0c;本科生生&#xff0c;20年通过校招进入武汉某软件公司&#xff0c;干了差不多4年的功能测试&#xff0c;今年国庆&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能…