WPF连接USB相机,拍照,视频 示例

ops/2025/1/12 12:41:56/

USB相机连接

项目通过AForge库实现WPF 连接相机,进行拍照录像。

安装 AForge 库

在NuGet 中下载安装这三个包

AForge.Video
AForge.Control
AForge.Video.DirectShow

代码示例

辅助类 CameraHelper.cs

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Windows;
using AForge.Controls;
using AForge.Video.DirectShow;namespace WpfApp4
{public static class CameraHelper{private static FilterInfoCollection _cameraDevices;private static VideoCaptureDevice div = null;private static VideoSourcePlayer sourcePlayer = new VideoSourcePlayer();public static bool _isDisplay = false;// 指示_isDisplay设置为true后,是否设置了其他的sourcePlayer,若未设置则_isDispaly重设为falseprivate static bool isSet = false;/// <summary>/// 获取或设置摄像头设备,无设备则为null/// </summary>public static FilterInfoCollection CameraDevices{get{return _cameraDevices;}set{_cameraDevices = value;}}/// <summary>/// 指示是否显示摄像头画面/// </summary>public static bool IsDisplay{get { return _isDisplay; }set { _isDisplay = value; }}/// <summary>///  获取或设置VideoSourcePlayer控件///  只有当IsDispaly设置为true时,该属性才可以设置成功/// </summary>public static VideoSourcePlayer SourcePlayer{get { return sourcePlayer; }set{if (_isDisplay){sourcePlayer = value;isSet = true;}}}/// <summary>/// 更新摄像头信息/// </summary>public static void UpdateCameraDevices(){_cameraDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);}/// <summary>/// 设置使用的摄像头设备/// </summary>/// <param name="index">设备在CameraDevice中的索引</param>/// <returns></returns>public static bool SetCameraDevice(int index){if (!isSet){_isDisplay = false;}// 无设备,返回falseif (_cameraDevices.Count <= 0 || index < 0){return false;}if (index > _cameraDevices.Count - 1){return false;}// 设定初始视频设备div = new VideoCaptureDevice(_cameraDevices[index].MonikerString);sourcePlayer.VideoSource = div;div.Start();sourcePlayer.Start();return true;}/// <summary>/// /// </summary>/// <param name="filePath"></param>/// <param name="fileName"></param>/// <returns></returns>public static string CaptureImage(string filePath, string fileName = null){if (sourcePlayer.VideoSource == null){return null;}if (!Directory.Exists(filePath)){Directory.CreateDirectory(filePath);}try{Image bitmap = sourcePlayer.GetCurrentVideoFrame();if (fileName == null){fileName = DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss");}string fullPath = Path.Combine(filePath, fileName+"-cap.jpg");bitmap.Save(fullPath,ImageFormat.Jpeg);bitmap.Dispose();return fullPath;}catch (Exception e){MessageBox.Show(e.Message.ToString());return null;}}/// <summary>/// 关闭相机 /// </summary>public static void CloseDevice(){if(div!= null && div.IsRunning){sourcePlayer.Stop();div.SignalToStop();div = null;_cameraDevices = null;}}}
}

MainWindow.xaml

<Window x:Class="WpfApp3.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:local="clr-namespace:WpfApp3"xmlns:wfi ="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration"xmlns:aforge ="clr-namespace:AForge.Controls;assembly=AForge.Controls"Closing="Window_Closing"mc:Ignorable="d"Title="MainWindow" Height="600" Width="1280"><Grid><StackPanel><Grid><Grid.ColumnDefinitions><ColumnDefinition/><ColumnDefinition/></Grid.ColumnDefinitions><wfi:WindowsFormsHost Grid.Column="0"><aforge:VideoSourcePlayer x:Name="player" Height="480" Width="640"/></wfi:WindowsFormsHost><Image Grid.Column="1" Name="imgCapture" Stretch="Fill" Height="480" Width="640"/></Grid><Button Name="btnCapture" Click="btnCapture_Click">拍照</Button><Button Name="btnOpenCamera" Click="btnOpenCamera_Click">打开</Button><Button Name="btnCloseCamera" Click="btnCloseCamera_Click">关闭</Button></StackPanel></Grid>
</Window>

MainWindow.xaml.cs

using System;
using System.Windows;
using System.Windows.Media.Imaging;
using WpfApp4;namespace WpfApp3
{/// <summary>/// MainWindow.xaml 的交互逻辑/// </summary>public partial class MainWindow : Window{public MainWindow(){InitializeComponent();CameraHelper.IsDisplay=true;CameraHelper.SourcePlayer = player;CameraHelper.UpdateCameraDevices();}private void btnOpenCamera_Click(object sender, RoutedEventArgs e){CameraHelper.UpdateCameraDevices();if (CameraHelper.CameraDevices.Count > 0){CameraHelper.SetCameraDevice(0);}}private void btnCapture_Click(object sender, RoutedEventArgs e){string fullPath = CameraHelper.CaptureImage(AppDomain.CurrentDomain.BaseDirectory+@"\Capture");BitmapImage bit = new BitmapImage();bit.BeginInit();bit.UriSource = new Uri(fullPath);bit.EndInit();imgCapture.Source = bit;}private void Window_Closing(object sender,System.ComponentModel.CancelEventArgs e){CameraHelper.CloseDevice();}private void btnCloseCamera_Click(object sender, RoutedEventArgs e){CameraHelper.CloseDevice();}}
}

实现效果

左边是实时录像,右边是拍照定格,且照片可保存


http://www.ppmy.cn/ops/149090.html

相关文章

Hybrid A*算法详解

1. 引言 Hybrid A算法是一种用于自动驾驶车辆路径规划的高效算法&#xff0c;它巧妙地结合了传统A算法的离散搜索特性和连续空间中的运动学约束。本文将从理论到实践&#xff0c;深入剖析Hybrid A*算法的工作原理和实现细节。 2. 算法原理 2.1 基本概念 Hybrid A算法的核心…

SQLAlchemy 创建索引

以下是使用 SQLAlchemy 创建索引的步骤&#xff1a; 解决思路&#xff1a; 首先&#xff0c;需要导入必要的 SQLAlchemy 模块。定义一个表&#xff0c;在表的列上添加索引。可以使用 Index 类来创建索引&#xff0c;指定索引的名称和列。 示例代码&#xff1a; from sqlalc…

【在安卓平台上,Unity与C/C++编写的.so动态库交互的实现】

在安卓平台上,Unity与C/C++编写的.so动态库交互的实现,通常通过JNI(Java Native Interface)和P/Invoke机制来完成。通过这种方式,C#脚本可以调用C/C++代码中的函数,并与本地库进行交互。 以下是一个简单的步骤演示,展示如何在Unity中与安卓平台上的.so动态库交互。 步…

whowantstobeking靶机

一.打开靶机 发现了个用户名 kali扫ip&#xff08;arp-scan -l&#xff09;&#xff0c;去浏览器访问 二.漏洞利用 curl http://192.168.95.148:80/skeylogger -o skeylogger file skeylogger 是个ELF文件 利用strings命令&#xff0c;通过此命令可以获取到一些有用的信息 …

Vue.js组件开发-Vue CLI如何配置浏览器兼容性

Vue.js组件开发中&#xff0c;使用Vue CLI配置浏览器兼容性主要涉及到对Babel、Polyfills以及CSS处理工具的配置。 1. 配置Babel Vue CLI默认使用Babel进行代码转换&#xff0c;以支持旧版浏览器。可以通过修改或创建Babel配置文件&#xff08;.babelrc或babel.config.js&…

算法:两个升序单链表的合并

将两个按值排序的带头结点的单链表La和Lb排列成一个升序的 单链表&#xff0c;并返回一个新的单链表的表头指针 &#xff08;两个升序合并成升序&#xff0c;用尾插法&#xff09; LinkList Merge_LinkList(LNode* La, LNode* Lb) {//准备工作LNode* Lc;//新链表的头结点LNode…

Spring Boot 集成 MyBatis 全面讲解

Spring Boot 集成 MyBatis 全面讲解 MyBatis 是一款优秀的持久层框架&#xff0c;与 Spring Boot 集成后可以大大简化开发流程。本文将全面讲解如何在 Spring Boot 中集成 MyBatis&#xff0c;包括环境配置、基础操作、高级功能和最佳实践。 一、MyBatis 简介 1. SqlSession …

高可用虚拟IP-keepalived

个人觉得华为云这个文档十分详细&#xff1a;使用虚拟IP和Keepalived搭建高可用Web集群_弹性云服务器 ECS_华为云 应用场景&#xff1a;虚拟IP技术。虚拟IP&#xff0c;就是一个未分配给真实主机的IP&#xff0c;也就是说对外提供数据库服务器的主机除了有一个真实IP外还有一个…