首页 > 其他分享 >WPF使用WPFMediaKit/AForge调用摄像头示例 .net core 8.0 也支持

WPF使用WPFMediaKit/AForge调用摄像头示例 .net core 8.0 也支持

时间:2023-08-18 10:37:20浏览次数:43  
标签:core 8.0 void 示例 private AForge WPFMediaKit WPF 摄像头

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

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

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

WPFMediaKit

WPFMediaKit源码GITHUB​github.com/Sascha-L/WPF-MediaKit

新建项目,添加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;
            }
        }
 

标签:core,8.0,void,示例,private,AForge,WPFMediaKit,WPF,摄像头
From: https://www.cnblogs.com/webenh/p/17639722.html

相关文章

  • 使用.NET Core进行性能优化和调优
    当涉及使用.NETCore进行性能优化和调优时,有许多方面可以考虑,包括代码优化、内存管理、数据库查询优化等。以下是一个简要的指南,涵盖了一些重要的方面,您可以在博客中展开介绍。1.代码优化和性能剖析使用高效的算法和数据结构:使用适合问题的最优算法和数据结构,例如使用哈希表、树......
  • 30个shell脚本简单示例
    30个简单且常用的LinuxShell脚本命令及示例,有用~~时代Java 2023-08-1807:40 发表于北京↑ 点击上面 “时代Java”关注我们,关注新技术,学习新知识!shell一直是类Unix系统的本地命令行解释器。它已被证明是Unix的主要功能之一,并发展成为一个全新的主题。Linux提供了各......
  • ESXI8.0 安装OpenWrt高大全版本作为旁路由
    安装esir-openwrt的高大全版当然是为了旅游了,本文只讲述我们已经有ESXI服务器,如何在自己的ESXI上安装esir大神openwrt高大全的版本;后面的使用,我相信聪明的你,一看就会了。 一、准备材料:1.镜像下载:01-LeanCodex86_64Firmware|固件-GoogleDrive 无法通过谷歌网盘下......
  • .net core发布到IIS上出现 HTTP 错误 500.19
    ​1.检查.netcore环境运行环境是否安装完成,类似如下环境​编辑 2.IIS是否安装全本次原因就是IIS未安装全导致的按照网上说的手动重启iis(iisreset)也不行 ​......
  • 1.3 参数查询入门示例
    一、参数查询1.模板准备1)新建普通报表,新建数据集ds1,SQL语句为:SELECT*FROM销量。2)点击「模板>模板参数」,在弹出的「模板参数」设置页面中,点击添加按钮添加参数。3)双击左侧的页面中双击参数名称,将参数名设置为「地区」,在右侧的默认值处,设置默认值为「华北」,点击「确认」。......
  • 控制台启动 asp.net core 发布文件
    前言:  记录一下命令,忘了再来看看启动命令  dotnet项目名称.dll--urls=https://localhost:4200...(环境变量参数)  这种方式使用控制台启动。  --urls=https://localhost:4200属于环境变量参数,后面还可以追加其他环境参数......
  • MySQL 8.0 参考手册——8.2优化 SQL 语句(二)
    8.2.1.13条件过滤  8.2.1.14恒定折叠优化8.2.1.15ISNULL优化8.2.1.16ORDERBY优化8.2.1.17GROUPBY优化8.2.1.18DISTINCT优化8.2.1.19LIMIT查询优化8.2.1.20函数调用优化8.2.1.21窗口函数优化8.2.1.22行构造表达式优化8.2.1.23避免全表扫描......
  • /proc/PID/maps 文件及示例说明
    文件及字段说明这个文件中的内容描述了进程的虚拟内存空间中的不同区域,包括代码段、数据段、堆、栈以及共享库等。每一行都代表了一个内存区域,并包含以下列:起始地址和结束地址:内存区域在虚拟内存空间中的起始地址和结束地址。权限:内存区域的访问权限,如读、写、执行等。偏移量......
  • 全选文本框示例
    一、实现效果点击全选按钮/取消全选,控制商品的全选或取消每个商品的复选框都选中后,自动勾上全选按钮,或者商品任何一个复选框没有选中,取消全选二、思路就是由大的全选按钮,控制所有的复选框小的复选框控制大的全选按钮三、js中小的复选框控制大的全选框,用到了一个css伪类......
  • .NET Core 单元测试 - 模拟 IOptions<T>
    技术标签:【中文标题】.NETCore单元测试-模拟IOptions<T>【英文标题】:.NETCoreUnitTesting-MockIOptions<T>【发布时间】:2017-04-1401:49:54【问题描述】:我觉得我在这里遗漏了一些非常明显的东西。我有需要使用.NETCore IOptions 模式(?)注入选项的类。当我对该类......