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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C# 將透明圖片的非透明區(qū)域轉(zhuǎn)換成Region的實(shí)例代碼
以下代碼實(shí)現(xiàn)將一張帶透明度的png圖片的非透明部分轉(zhuǎn)換成Region輸出的方法,有需要的朋友可以參考一下2013-10-10
C# 實(shí)現(xiàn)Scoket心跳機(jī)制的方法
這篇文章主要介紹了C# 實(shí)現(xiàn)Scoket心跳機(jī)制的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02
C#使用Lazy<T>實(shí)現(xiàn)對(duì)客戶訂單的延遲加載
這篇文章介紹了C#使用Lazy<T>實(shí)現(xiàn)對(duì)客戶訂單延遲加載的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-08
C#使用OpenCvSharp實(shí)現(xiàn)透視變換功能
這篇文章主要為大家詳細(xì)介紹了C#如何使用OpenCvSharp實(shí)現(xiàn)透視變換的功能,文中的示例代碼簡潔易懂,具有一定的學(xué)習(xí)價(jià)值,需要的小伙伴可以參考下2023-11-11
WMI獲取硬件信息封裝函數(shù)方法(聯(lián)想臺(tái)式機(jī)出廠編號(hào) CPUID BIOS序列號(hào) 硬盤信息 顯卡信息 MAC地址)
這篇文章主要介紹了WMI獲取硬件信息的方法,硬件信息有:聯(lián)想臺(tái)式機(jī)出廠編號(hào) CPUID BIOS序列號(hào) 硬盤信息 顯卡信息 MAC地址2013-11-11
關(guān)于C#中yield關(guān)鍵字的深入解析
這篇文章主要給大家介紹了關(guān)于C#中yield關(guān)鍵字的深入解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用C#具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11
c#使用UTF-8編碼實(shí)現(xiàn)處理多語言文本
UTF-8編碼是現(xiàn)代應(yīng)用中處理多語言文本的首選,所以本文為大家詳細(xì)介紹了C#如何使用UTF-8編碼實(shí)現(xiàn)處理多語言文本,感興趣的小伙伴可以了解下2024-01-01

