WPF开发者QQ群:340500857

由于微信群人数太多入群请添加小编微信号

 yanjinhuawechatW_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 实现调用本机摄像头~相关推荐

  1. VMware虚拟机中调用本机摄像头详解

    本机环境: 虚拟机:VMware Workstation 16 Player 虚拟机内系统:Centos7(其它也ok的) 本机:win10(任何系统都ok) 调用本机摄像头: 首先wins+R输入s ...

  2. 使用基于 WebRTC 的 JavaScript API 在浏览器环境里调用本机摄像头

    HTML5,JavaScript 和现代浏览器这套三驾马车的组合,使得传统的 Web 应用较之过去能实现更多更丰富的同用户交互的功能.摄像头如今已成为智能手机的标配,前端 Web 应用也出现了越来越多 ...

  3. JAVA使用摄像头录制_JavaCV开发详解之1:调用本机摄像头视频(建议使用javaCV最新版本)...

    引入依赖 org.bytedeco javacv 1.5.3 org.bytedeco javacv-platform 1.5.3 代码实现 package com.java.mmzsblog; im ...

  4. java录制视频_javacv开发详解之1:调用本机摄像头视频(建议使用javaCV最新版本)...

    javaCV系列文章: ' i# f% S' a# J9 X! w- g) wjavacv开发详解之1:调用本机摄像头视频 4 r' C, [4 ?' M7 Y; }javaCV开发详解之2:推流器实 ...

  5. C# 利用Aforge调用本机摄像头完成拍照,录像

    用C#做了一个简单的摄像头录像项目,记录一下. 实现功能 打开.关闭摄像头并显示相应画面 实现拍照功能 实现录像功能 实现保存图片.录像的功能 运行界面效果 winForm控件 首先安装NuGet程序 ...

  6. 在前端页面中调用本机的摄像头

    如何在页面中调用本机的摄像头 前段时间,机缘巧合,了解了一手如何在前端页面中调用本机摄像头的方法. 使用了navigator.mediaDevices.getUserMedia()的方法,具体可以参考 ...

  7. HTML网页调用海康摄像头,[FastVideo]Web Html5 无插件方式连接海康摄像头[2]

    [实例简介] 此程序可以在Web Html通过Url或者 JS的方式调用海康摄像头,不需要在客户机浏览器安装插件.可以安装为服务,为Web提供后台服务. [实例截图] [核心代码] FastVideo ...

  8. Silverlight调用本机exe程序

    要点: 1. Silverlight必须启用OOB模式,以及 Require elevated trust when running in-browser.参考下图设置 注:OOB模式,并不意味着必须 ...

  9. yunyang tensorflow-yolov3 Intel Realsense D435 (并发)调用两个摄像头运行识别程序并画框

    只是一个测试,测试在并发运行下,同时开启两个摄像头获取视频流并调用识别函数的运行结果,以后在摄像头多的情况下,肯定不能这样,需要批量创建各种对象. 并发,指的是不在多线程的情况下,每个摄像头的视频流送 ...

最新文章

  1. AngularJs的UI组件ui-Bootstrap分享(六)——Tabs
  2. Neural Networks神经网络编程入门
  3. 循环队列的java结构_Java数据结构——循环队列
  4. SQL基础-- 数据处理(DML、RETURNING、MERGE INTO)
  5. asp.net 写入html代码,asp.net读取模版并写入文本文件
  6. 互联网晚报 | 11月25日 星期四 | 花呗启动品牌隔离;小米MIUI全球月活用户突破5亿;《长津湖》成中国影史票房冠军...
  7. 华为鸿蒙搭载哪些手机,华为鸿蒙系统支持哪些手机 可以装华为鸿蒙系统手机...
  8. ros之旋转加平移公式
  9. PAIP.手机sms短信,联系人的同步与备份.txt
  10. 1月英语总结—发现新大陆
  11. java简历个人技术描述_简历个人描述
  12. Ubuntu 15.04 搜狗输入法 无法切换到英文输入
  13. 复杂的1秒--图解Google搜索技术
  14. 如何解决传统工厂能耗痛点
  15. 2021年美赛C题思路
  16. 强化学习 之 探索与利用
  17. python矩阵的共轭转置_基础 | Python 下的矩阵操作
  18. element plus中的el-link如何去掉下划线
  19. python内置库turtle绘制有趣图形
  20. shared_from_this的使用

热门文章

  1. vi和vim 的常用操作
  2. 配置PHP启动Apache服务报错
  3. 监控cacti中的RRDtool用法详解
  4. JailbreakMe.com-最新浏览器模式破解iPhones,iPads和iPod Touches方法
  5. 如何识别是三层交换机还是二层交换机
  6. 构建Windows Server 2008虚拟实验室
  7. did双重差分法_Stata中双重差分操流程及代码
  8. python oa系统_用python把C#操作OA的例子重写了一下
  9. sublime-text3按tab跳出括号
  10. html之file标签 --- 图片上传前预览 -- FileReader