WPF實(shí)現(xiàn)調(diào)用本機(jī)攝像頭的示例代碼
此項(xiàng)目使用了OpenCVSharp加載本地?cái)z像頭,多個(gè)攝像頭支持切換展示,也可以展示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($"北京時(shí)間:{?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();
????????}
????}
}
效果預(yù)覽

源碼地址如下
Github:https://github.com/WPFDevelopersOrg
https://github.com/WPFDevelopersOrg/OpenCVSharpExample
Gitee:https://gitee.com/WPFDevelopersOrg
到此這篇關(guān)于WPF實(shí)現(xiàn)調(diào)用本機(jī)攝像頭的示例代碼的文章就介紹到這了,更多相關(guān)WPF調(diào)用攝像頭內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#+MO實(shí)現(xiàn)一個(gè)道路編輯軟件(剛開始)
C#+MO實(shí)現(xiàn)一個(gè)道路編輯軟件(剛開始)...2007-04-04
c# List find()方法返回值的問題說明(返回結(jié)果為對象的指針)
本篇文章主要介紹了c#中List find()方法返回值的問題說明(返回結(jié)果為對象的指針) 需要的朋友可以過來參考下,希望對大家有所幫助2014-01-01
C#多線程開發(fā)實(shí)戰(zhàn)記錄之線程基礎(chǔ)
線程是一個(gè)獨(dú)立的運(yùn)行單元,每個(gè)進(jìn)程內(nèi)部有多個(gè)線程,每個(gè)線程可以各自同時(shí)執(zhí)行指令,每個(gè)線程有自己獨(dú)立的棧,但是與進(jìn)程內(nèi)的其他線程共享內(nèi)存,這篇文章主要給大家介紹了關(guān)于C#多線程開發(fā)實(shí)戰(zhàn)記錄之線程基礎(chǔ)的相關(guān)資料,需要的朋友可以參考下2021-09-09

