WPF实现调用本机摄像头的示例代码
更新时间:2022-08-03 22:54:30 作者:佚名 我要评论(0)
此项目使用了OpenCVSharp加载本地摄像头,多个摄像头支持切换展示,也可以展示rtsp地址。
使用NuGet如下:
代码如下
一、创建MainWindow.xa
使用NuGet如下:
代码如下
一、创建MainWindow.xa
此项目使用了OpenCVSharp加载本地摄像头,多个摄像头支持切换展示,也可以展示rtsp地址。
使用NuGet如下:
代码如下
一、创建MainWindow.xaml代码如下。
?<ws:Window?x:Class="OpenCVSharpExample.MainWindow" ????????xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" ????????xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" ????????xmlns:ws="https://github.com/WPFDevelopersOrg.WPFDevelopers.Minimal" ????????xmlns:d="http://schemas.microsoft.com/expression/blend/2008" ????????xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" ????????xmlns:local="clr-namespace:OpenCVSharpExample" ????????Icon="OpenCV_Logo.png" ????????mc:Ignorable="d"?WindowStartupLocation="CenterScreen" ????????Title="OpenCVSharpExample?https://github.com/WPFDevelopersOrg"?Height="450"?Width="800"> ????<Grid> ????????<Grid.RowDefinitions> ????????????<RowDefinition?Height="Auto"/> ????????????<RowDefinition?/> ????????????<RowDefinition?Height="Auto"/> ????????</Grid.RowDefinitions> ????????<ComboBox?Name="ComboBoxCamera"?ItemsSource="{Binding?CameraArray,RelativeSource={RelativeSource?AncestorType=local:MainWindow}}"? ??????????????????Width="200"?SelectedIndex="{Binding?CameraIndex,RelativeSource={RelativeSource?AncestorType=local:MainWindow}}" ??????????????????SelectionChanged="ComboBoxCamera_SelectionChanged"/> ????????<Image?Grid.Row="1"?Name="imgViewport"?Margin="0,4"/> ????????<StackPanel?Orientation="Horizontal" ????????????????????HorizontalAlignment="Center" ????????????????????Grid.Row="2"> ????????????<!--<Button?Name="btRecord"?Click="btRecord_Click"?Content="Record"?Style="{StaticResource?PrimaryButton}"?Width="100"?Height="50"?Margin="16"/>--> ????????????<Button?Name="btStop"?Click="btStop_Click"?Content="Stop"??Width="100"?Height="50"?Margin="16"/> ????????</StackPanel> ????</Grid> </ws:Window>
二、MainWindow.xaml.cs代码如下。
using?OpenCvSharp; using?OpenCvSharp.Extensions; using?System; using?System.Collections.Generic; using?System.Drawing; using?System.Drawing.Imaging; using?System.IO; using?System.Management; using?System.Threading; using?System.Windows; using?System.Windows.Controls; using?System.Windows.Media.Imaging; using?System.Windows.Threading; namespace?OpenCVSharpExample { ????///?<summary> ????///?MainWindow.xaml?的交互逻辑 ????///?</summary> ????public?partial?class?MainWindow ????{ ????????private?VideoCapture?capCamera; ????????private?Mat?matImage?=?new?Mat(); ????????private?Thread?cameraThread; ????????public?List<string>?CameraArray ????????{ ????????????get?{?return?(List<string>)GetValue(CameraArrayProperty);?} ????????????set?{?SetValue(CameraArrayProperty,?value);?} ????????} ????????public?static?readonly?DependencyProperty?CameraArrayProperty?= ????????????DependencyProperty.Register("CameraArray",?typeof(List<string>),?typeof(MainWindow),?new?PropertyMetadata(null)); ????????public?int?CameraIndex ????????{ ????????????get?{?return?(int)GetValue(CameraIndexProperty);?} ????????????set?{?SetValue(CameraIndexProperty,?value);?} ????????} ????????public?static?readonly?DependencyProperty?CameraIndexProperty?= ????????????DependencyProperty.Register("CameraIndex",?typeof(int),?typeof(MainWindow),?new?PropertyMetadata(0)); ???????? ????????public?MainWindow() ????????{ ????????????InitializeComponent(); ????????????Width?=?SystemParameters.WorkArea.Width?/?1.5; ????????????Height?=?SystemParameters.WorkArea.Height?/?1.5; ????????????this.Loaded?+=?MainWindow_Loaded; ????????} ????????private?void?MainWindow_Loaded(object?sender,?RoutedEventArgs?e) ????????{ ????????????InitializeCamera(); ????????} ????????private?void?ComboBoxCamera_SelectionChanged(object?sender,?SelectionChangedEventArgs?e) ????????{ ????????????if?(CameraArray.Count?-?1?<?CameraIndex) ????????????????return; ????????????if?(capCamera?!=?null?&&?cameraThread?!=?null) ????????????{ ????????????????cameraThread.Abort(); ????????????????StopDispose(); ????????????} ????????????capCamera?=?new?VideoCapture(CameraIndex); ????????????capCamera.Fps?=?30; ????????????CreateCamera(); ???????????? ????????} ????????private?void?InitializeCamera() ????????{ ????????????CameraArray?=?GetAllConnectedCameras(); ????????} ????????List<string>?GetAllConnectedCameras() ????????{ ????????????var?cameraNames?=?new?List<string>(); ????????????using?(var?searcher?=?new?ManagementObjectSearcher("SELECT?*?FROM?Win32_PnPEntity?WHERE?(PNPClass?=?'Image'?OR?PNPClass?=?'Camera')")) ????????????{ ????????????????foreach?(var?device?in?searcher.Get()) ????????????????{ ????????????????????cameraNames.Add(device["Caption"].ToString()); ????????????????} ????????????} ????????????return?cameraNames; ????????} ????????void?CreateCamera() ????????{ ????????????cameraThread?=?new?Thread(PlayCamera); ????????????cameraThread.Start(); ????????} ????????private?void?PlayCamera() ????????{ ????????????while?(capCamera?!=?null?&&?!capCamera.IsDisposed) ????????????{ ????????????????capCamera.Read(matImage); ????????????????if?(matImage.Empty())?break; ????????????????Dispatcher.BeginInvoke(DispatcherPriority.Normal,?new?Action(()?=> ????????????????{ ????????????????????var?converted?=?Convert(BitmapConverter.ToBitmap(matImage)); ????????????????????imgViewport.Source?=?converted; ????????????????})); ????????????} ????????} ??????? ????????private?void?btStop_Click(object?sender,?RoutedEventArgs?e) ????????{ ????????????StopDispose(); ????????????btStop.IsEnabled?=?false; ????????} ????????void?StopDispose() ????????{ ????????????if?(capCamera?!=?null?&&?capCamera.IsOpened()) ????????????{ ????????????????capCamera.Dispose(); ????????????????capCamera?=?null; ????????????} ????????} ????????void?CreateRecord() ????????{ ????????????cameraThread?=?new?Thread(PlayCamera); ????????????cameraThread.Start(); ????????} ????????BitmapImage?Convert(Bitmap?src) ????????{ ????????????System.Drawing.Image?img?=?src; ????????????var?now?=?DateTime.Now; ????????????var?g?=?Graphics.FromImage(img); ????????????var?brush?=?new?SolidBrush(System.Drawing.Color.Red); ????????????g.DrawString($"北京时间:{?now.ToString("yyyy年MM月dd日?HH:mm:ss")}",?new?System.Drawing.Font("Arial",?18),?brush,?new?PointF(5,?5)); ????????????brush.Dispose(); ????????????g.Dispose(); ????????????MemoryStream?ms?=?new?MemoryStream(); ????????????img.Save(ms,?ImageFormat.Bmp); ????????????ms.Seek(0,?SeekOrigin.Begin); ????????????BitmapImage?image?=?new?BitmapImage(); ????????????image.BeginInit(); ????????????image.StreamSource?=?ms; ????????????image.EndInit(); ????????????image.Freeze(); ????????????return?image; ????????} ????????protected?override?void?OnClosed(EventArgs?e) ????????{ ????????????StopDispose(); ????????} ????} }
效果预览
源码地址如下
Github:https://github.com/WPFDevelopersOrg
https://github.com/WPFDevelopersOrg/OpenCVSharpExample
Gitee:https://gitee.com/WPFDevelopersOrg
到此这篇关于WPF实现调用本机摄像头的示例代码的文章就介绍到这了,更多相关WPF调用摄像头内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
您可能感兴趣的文章:
- WPF使用AForge调用摄像头
- C# WPF使用AForge类库操作USB摄像头拍照并保存
- WPF中在摄像头视频上叠加控件的解决方案
您可能感兴趣的文章:
相关文章
详解Python如何利用pymysql封装项目通用的连接和查询
目录前言pymysql 介绍与安装pymysql 的使用封装项目通用的连接和查询结语前言 一个项目通常都需要有数据库,而对于python这门语言,除了一些2022-08-03Python docx库删除复制paragraph及行高设置图片插入示例
目录引言1、复制paragraph2、删除paragraph3、插入图片和paragraph行高设置引言 这两天做一个python小工具,用到了docx库,涉及到paragraph的2022-08-03
最新评论