WPF 实现调用本机摄像头~
WPF開發者QQ群:340500857
?? ??? 由于微信群人數太多入群請添加小編微信號
?yanjinhuawechat 或 W_Feng_aiQ?邀請入群
?需備注WPF開發者?
? PS:有更好的方式歡迎推薦。
??接著很久前的上一篇
? 此項目使用了OpenCVSharp加載本地攝像頭,多個攝像頭支持切換展示,也可以展示rtsp地址。
使用NuGet如下:
01
—
代碼如下
一、創建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();}} }02
—
效果預覽
鳴謝素材提供者 -?屈越
源碼地址如下
Github:https://github.com/WPFDevelopersOrg
https://github.com/WPFDevelopersOrg/OpenCVSharpExample
Gitee:https://gitee.com/WPFDevelopersOrg
WPF開發者QQ群:?340500857?
Github:https://github.com/WPFDevelopersOrg
出處:https://www.cnblogs.com/yanjinhua
版權:本作品采用「署名-非商業性使用-相同方式共享 4.0 國際」許可協議進行許可。
轉載請著名作者 出處 https://github.com/WPFDevelopersOrg
掃一掃關注我們,
更多知識早知道!
點擊閱讀原文可跳轉至源代碼
總結
以上是生活随笔為你收集整理的WPF 实现调用本机摄像头~的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 观察者模式VS发布-订阅模式
- 下一篇: 想说爱你不容易 | 使用最小 WEB A