调用摄像头使我们经常会用到的一个功能,可以根据摄像头捕捉到的图像进行分析处理来做很多的东西,比如电子档案、图像识别、AI分析等等。

本示例中主要介绍Nuget最常用的两个调用摄像头的轮子 WPFMediaKit、AForge

环境: VS2019, .NetFramework472 WPF   (.net core 8.0 也支持)

WPFMediaKit

新建项目,添加Nuget,安装WPFMediaKit

前台代码

<Window x:Class="摄像头测试.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:wpfmedia="clr-namespace:WPFMediaKit.DirectShow.Controls;assembly=WPFMediaKit"
xmlns:local="clr-namespace:摄像头测试"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800" Loaded="Window_Loaded">
<Grid>
<DockPanel>
<DockPanel DockPanel.Dock="Top">
<ComboBox Name="cb" DockPanel.Dock="Top" SelectionChanged="cb_SelectionChanged"></ComboBox>
<Button Click="Button_Click" DockPanel.Dock="top" Height="45" Content="拍照" Margin="160,0,92,0"/>
</DockPanel>
<wpfmedia:VideoCaptureElement x:Name="vce" ></wpfmedia:VideoCaptureElement>
</DockPanel>
</Grid>
</Window>

后台代码

        private void Window_Loaded(object sender, RoutedEventArgs e)
{
//现在电脑上装的所有摄像头中,选择一个摄像头。
cb.ItemsSource = MultimediaUtil.VideoInputNames;
//设置第0个摄像头为默认摄像头。
if (MultimediaUtil.VideoInputNames.Length > 0)
{
cb.SelectedIndex = 0;
}
else
{
MessageBox.Show("电脑没有安装任何摄像头");
}
} private void cb_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
vce.VideoCaptureSource = (string)cb.SelectedItem;
} private void Button_Click(object sender, RoutedEventArgs e)
{
//抓取控件做成图片
RenderTargetBitmap bmp = new RenderTargetBitmap(
(int)vce.ActualWidth, (int)vce.ActualHeight,
96, 96, PixelFormats.Default);
bmp.Render(vce);
BitmapEncoder encoder = new JpegBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(bmp));
using (MemoryStream ms = new MemoryStream())
{
encoder.Save(ms);
byte[] captureData = ms.ToArray();
//保存图片
File.WriteAllBytes("E:/1.jpg", captureData);
}
vce.Pause();
}

接入代码编译后,VS设计器中如报错没有找到文件的解决方案:

AForge

http://AForge.NET 是用C#写的一个关于计算机视觉和人工智能领域的框架,它包括图像处理、神经网络、遗传算法和机器学习等。

新建项目,添加Nuget,安装下列AForge包

由于在WPF当中使用AForge,需要通过WindowsFormsHost嵌入在WPF当中使用, 所以需要给项目添加相关引用:

前台代码

<Window x:Class="摄像头测试.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:wfi ="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration"
xmlns:aforge="clr-namespace:AForge.Controls;assembly=AForge.Controls"
xmlns:local="clr-namespace:摄像头测试"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800" Loaded="Window_Loaded">
<Grid>
<wfi:WindowsFormsHost Margin="0,30,0,0">
<aforge:VideoSourcePlayer x:Name="player" Dock="Fill" />
</wfi:WindowsFormsHost>
<Image Margin="0,30,0,0" HorizontalAlignment="Stretch" Name="frameHolder" VerticalAlignment="Stretch" Stretch="Fill"/>
<StackPanel Height="30" Orientation="Horizontal" VerticalAlignment="Top" HorizontalAlignment="Center">
<Button Content="连接" Margin="20,0,0,0" Height="30" Width="100" x:Name="btnConn" Click="btnConn_Click" />
<Button Content="拍照" Margin="20,0,0,0" Height="30" Width="100" x:Name="btnCap" Click="btnCap_Click" />
<Button Content="断开" Margin="20,0,0,0" Height="30" Width="100" x:Name="btnClose" Click="btnClose_Click" />
</StackPanel>
<Image x:Name="img"/>
</Grid>
</Window>

后台代码

        private FilterInfoCollection videoDevices;
VideoCaptureDevice videoSource; private void Window_Loaded(object sender, RoutedEventArgs e)
{
videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
} private void btnConn_Click(object sender, RoutedEventArgs e)
{
if (videoDevices.Count <= 0)
{
MessageBox.Show("请插入视频设备");
return;
} videoSource = new VideoCaptureDevice(videoDevices[0].MonikerString);//连接到第一个设备,可灵活改动
//videoSource.DesiredFrameSize = new System.Drawing.Size(240, 320);
//videoSource.DesiredFrameRate = 1; player.VideoSource = videoSource; videoSource.Start();
player.Start();
} private void btnCap_Click(object sender, RoutedEventArgs e)
{
if (player.VideoSource == null)
{
return;
}
//判断是否有这个目录,如果没有则新创建这个目录
/*if (!Directory.Exists(filePath))
{
Directory.CreateDirectory(filePath);
}*/
try
{
System.Drawing.Bitmap bitmap = player.GetCurrentVideoFrame();
/*if (fileName == null)
{
fileName = DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss");
}*/
//string str = @"" + fileName + ".jpg";
string str = "asd.jpg";//使用InitImage可以重复读写一张图,不用的话,就只能一直保存新的图片了
bitmap.Save(str, ImageFormat.Jpeg); //想看预览就用,不想看就不需要了 bitmap.Dispose(); img.Source = InitImage(str); }
catch (Exception ex)
{
Console.WriteLine(ex.Message.ToString());
}
} //解决不同进程读取同一张图片的问题,使用流来读图片
public BitmapImage InitImage(string filePath)
{
BitmapImage bitmapImage;
using (BinaryReader reader = new BinaryReader(File.Open(filePath, FileMode.Open)))
{
FileInfo fi = new FileInfo(filePath);
byte[] bytes = reader.ReadBytes((int)fi.Length);
reader.Close(); //image = new Image();
bitmapImage = new BitmapImage();
bitmapImage.BeginInit();
bitmapImage.StreamSource = new MemoryStream(bytes);
bitmapImage.EndInit();
bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
//image.Source = bitmapImage;
reader.Dispose();
}
return bitmapImage;
} private void btnClose_Click(object sender, RoutedEventArgs e)
{
if (videoSource != null && videoSource.IsRunning)
{
player.Stop();
videoSource.SignalToStop();
videoSource = null;
videoDevices = null;
}
}
 

WPF使用WPFMediaKit/AForge调用摄像头示例 .net core 8.0 也支持的更多相关文章

  1. AForge调用摄像头拍照时设置分辨率

    简单记录下AForge2.2.5.0版本调用摄像头拍照时设置分辨率的方法. FilterInfo info = _videoDevices[0];//获取第一个摄像头 _cameraDevice = ...

  2. opencv —— 调用摄像头采集图像 VideoCapture capture(0);

    如果要调用摄像头进行视频采集,将代码 VideoCapture capture("C:/Users/齐明洋/Desktop/1.mp4"); 中的 "C:/Users/齐 ...

  3. C#使用Aforge调用摄像头拍照

    一. 新建一个Winform项目 二.使用Nuget添加引用 安装下图中红色框住的两个程序包 安装完后发现安装了如下图的程序包,这是因为上述两个程序包存在对其它程序包的依赖. 三.编写程序 1. 窗体 ...

  4. 【WPF on .NET Core 3.0】 Stylet演示项目 - 简易图书管理系统(1)

    .NET Core 3.0已经发布了,除了一大堆令人激动的功能以外,也增加了对WPF的正式支持, 那么WPF在.NET Core 3.0下的开发体验如何呢? 本文利用了Stylet框架开发.NET C ...

  5. Emgucv(一)Aforge切换摄像头并调用摄像头属性

    一.新建一个Windows窗体应用程序,在Form1窗体上添加一个PictureBox控件.一个ComboBox控件,命名为PictureBox1.cbCapture,还有两个Button控件,Tex ...

  6. Asp.Net Core 2.0 项目实战(9) 日志记录,基于Nlog或Microsoft.Extensions.Logging的实现及调用实例

    本文目录 1. Net下日志记录 2. NLog的使用     2.1 添加nuget引用NLog.Web.AspNetCore     2.2 配置文件设置     2.3 依赖配置及调用     ...

  7. 在WPF中使用AForge.net控制摄像头拍照

    原文:在WPF中使用AForge.net控制摄像头拍照 利用AForge.net控制摄像头拍照最方便的方法就是利用PictureBox显示摄像头画面,但在WPF中不能直接使用PictureBox.必须 ...

  8. 【MediaKit】WPF项目中 调用摄像头拍照的开发包

    今天遇到一个 人事的项目,项目中需要调用摄像头给员工照相.如何解决这个问题呢? 介绍一个开发包给你,MediaKit.论坛里头的人都说好,但是黑兔觉得大家好才是真的好.你不妨试试~ 第一步:添加WPF ...

  9. C# - VS2019调用AForge库实现调用摄像头拍照功能

    前言 作为一名资深Delphi7程序员,想要实现摄像头扫描一维码/二维码功能,发现所有免费的第三方库都没有简便的实现办法,通用的OpenCV或者ZXing库基本上只支持XE以上的版本,而且一维码的识别 ...

  10. C#调用摄像头(AForge)实现扫描条码解析(Zxing)功能

    网上找了很多代码,都比较零散,以下代码纯自己手写,经过测试.下面有链接,下载后可以直接使用. 介绍: 自动识别:点击Start按钮会调用PC摄像头,代码内置Timer,会每100毫秒识别一下当前摄像头 ...

随机推荐

  1. 今天我们来聊一聊Java中的Semaphore

    写在开头 在上几天写<基于AQS手写一个同步器>时,很多同学留言说里面提到的Semaphore,讲得太笼统了,今天趁着周末有空,咱们就一起详细的学习和梳理一把 Semaphore. 什么是 ...

  2. mybatis generator生成mapper接口后的代理类,很方便使用。

    1.spring 配置: <bean id="superMapperProxy" class="com.qws.v1.daoImpl.MapperProxy&quo ...

  3. SVM简单分类的使用 sklearn机器学习

    # sklearn 库中导入 svm 模块 from sklearn import svm # 定义三个点和标签 X = [[2, 0], [1, 1], [2,3]] y = [0, 0, 1] # ...

  4. 力扣231(java)-2的幂(简单)

    题目: 给你一个整数 n,请你判断该整数是否是 2 的幂次方.如果是,返回 true :否则,返回 false . 如果存在一个整数 x 使得 n == 2x ,则认为 n 是 2 的幂次方. 示例 ...

  5. 浅谈 Node.js 热更新

    简介: 记得在 15 16 年那会 Node.js 刚起步的时候,我在去前东家的入职面试也被问到了要如何实现 Node.js 服务的热更新. 记得在 15 16 年那会 Node.js 刚起步的时候, ...

  6. [GPT] 对于一个复杂的html文档而言,如何用 js 批量替换页面上的某些文字从A替换为B,前提是不能去掉标签和已绑定的事件

      原生:示例代码 function replaceTextInDocument(node) { if (node.nodeType === Node.TEXT_NODE) { node.textCo ...

  7. 【Flink入门修炼】2-3 Flink Checkpoint 原理机制

    如果让你来做一个有状态流式应用的故障恢复,你会如何来做呢? 单机和多机会遇到什么不同的问题? Flink Checkpoint 是做什么用的?原理是什么? 一.什么是 Checkpoint? Chec ...

  8. Spring 是如何造出一个 Bean 的

    前言 使用 Java 作为第一开发语言的朋友们,相信大家或多或少的都使用过 Spring 这个开发框架,可以说 Spring 框架真是我们 Java 程序员的春天,在 Spring 中 Bean 是其 ...

  9. 【GUI软件】小红书搜索结果批量采集,支持多个关键词同时抓取!

    目录 一.背景介绍 1.1 爬取目标 1.2 演示视频 1.3 软件说明 二.代码讲解 2.1 爬虫采集模块 2.2 软件界面模块 2.3 日志模块 三.获取源码及软件 一.背景介绍 1.1 爬取目标 ...

  10. 【爬虫实战】用python爬今日头条热榜TOP50榜单!

    目录 一.爬取目标 二.爬取结果 三.代码讲解 四.技术总结 五.演示视频 六.附完整源码 一.爬取目标 您好!我是@马哥python说,一名10年程序猿. 今天分享一期爬虫案例,爬取的目标是:今日头 ...