WPF实现调用本机摄像头的示例代码

 更新时间:2022-08-03 22:54:30   作者:佚名   我要评论(0)

此项目使用了OpenCVSharp加载本地摄像头,多个摄像头支持切换展示,也可以展示rtsp地址。
使用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中在摄像头视频上叠加控件的解决方案

相关文章

  • WPF实现调用本机摄像头的示例代码

    WPF实现调用本机摄像头的示例代码

    此项目使用了OpenCVSharp加载本地摄像头,多个摄像头支持切换展示,也可以展示rtsp地址。 使用NuGet如下: 代码如下 一、创建MainWindow.xa
    2022-08-03
  • MySQL索引失效场景及解决方案

    MySQL索引失效场景及解决方案

    目录一、前言二、最左前缀匹配原则三、MySQL逻辑架构和优化器四、索引失效场景以及为何会失效五、总结一、前言 在对SQL语句进行索引查询时会
    2022-08-03
  • Spring超详细讲解IOC与解耦合

    Spring超详细讲解IOC与解耦合

    目录前言一.所谓耦合二.Spring三.核心IOC理解1.容器2.控制反转3.依赖注入四.Bean的实例化1.无参构造2.工厂静态方法3.工厂实例方法(常用)五
    2022-08-03
  • Java与SpringBoot对redis的使用方式

    Java与SpringBoot对redis的使用方式

    目录1.Java连接redis1.1 使用Jedis1.2 使用连接池连接redis1.3 java连接redis集群模式 2.SpringBoot整合redis2.1 StringRedisTemplate2.2 Re
    2022-08-03
  • 详解Python如何利用pymysql封装项目通用的连接和查询

    详解Python如何利用pymysql封装项目通用的连接和查询

    目录前言pymysql 介绍与安装pymysql 的使用封装项目通用的连接和查询结语前言 一个项目通常都需要有数据库,而对于python这门语言,除了一些
    2022-08-03
  • Python docx库删除复制paragraph及行高设置图片插入示例

    Python docx库删除复制paragraph及行高设置图片插入示例

    目录引言1、复制paragraph2、删除paragraph3、插入图片和paragraph行高设置引言 这两天做一个python小工具,用到了docx库,涉及到paragraph的
    2022-08-03
  • python解析照片拍摄时间进行图片整理

    python解析照片拍摄时间进行图片整理

    目录引言1. 获取图片拍摄时间2. 获取视频拍摄时间3. 根据图片时间建立文件夹完整代码引言 手机中拍摄照的照片和视频快爆了,想转移到PC端,并
    2022-08-03
  • Python中的socket网络模块介绍

    Python中的socket网络模块介绍

    目录Socket服务端(server.py)客户端(client.py)socket中的一些常用方法Socket 对象(内建)方法Python Internet 模块前言: Python3 提供了两个
    2022-08-03
  • python高温预警数据获取实例

    python高温预警数据获取实例

    引言 最近一段时间,四川真的感觉遭遇了最大最强高温,一到户外感觉都要被烤干了,可怕的故事是,现在才只有7月份呢,要是等到了8 、9月份,
    2022-08-03
  • Unity创建平铺网格地图的方法

    Unity创建平铺网格地图的方法

    本文实例为大家分享了Unity创建平铺网格地图的具体代码,供大家参考,具体内容如下 创建预制件 先拖进场景,再从层级拖回资源 选中源图像文
    2022-08-03

最新评论