WPF實現(xiàn)調(diào)用本機攝像頭的示例代碼
此項目使用了OpenCVSharp加載本地攝像頭,多個攝像頭支持切換展示,也可以展示rtsp地址。
使用NuGet如下:
代碼如下
一、創(chuàng)建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實現(xiàn)調(diào)用本機攝像頭的示例代碼的文章就介紹到這了,更多相關WPF調(diào)用攝像頭內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
c# List find()方法返回值的問題說明(返回結果為對象的指針)
本篇文章主要介紹了c#中List find()方法返回值的問題說明(返回結果為對象的指針) 需要的朋友可以過來參考下,希望對大家有所幫助2014-01-01