Avalonia学习(十七)-AForge(视频)

今天开始继续Avalonia练习。

本节:AForge

1.引入

AForge.Video.DirectShow

2.项目引入

前台代码(用image控件显示)

<Window xmlns="https://github.com/avaloniaui"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:vm="using:AvaloniaApplication1.ViewModels"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
        x:Class="AvaloniaApplication1.Views.MainWindow"
        x:DataType="vm:MainWindowViewModel"
        Icon="/Assets/avalonia-logo.ico"
        Title="AvaloniaApplication1">

    <Design.DataContext>
        <!-- This only sets the DataContext for the previewer in an IDE,
             to set the actual DataContext for runtime, set the DataContext property in code (look at App.axaml.cs) -->
        <vm:MainWindowViewModel/>
    </Design.DataContext>
  <Grid RowDefinitions="*,auto" ColumnDefinitions="*,auto">
    <ComboBox Name="ComboName" Width="120"/>
    <ComboBox Name="cbo_rate" Width="120"/>
    <Image Name="pictureBox1" Width="630"/>
  </Grid>
 
    
</Window>

后台代码

using AForge.Video.DirectShow;
using Avalonia.Controls;
using System.Drawing;
using System.IO;
using System;
using System.Drawing.Imaging;
using AForge.Video;
using Avalonia.Threading;

namespace AvaloniaApplication1.Views
{
    public partial class MainWindow : Window
    {
        private FilterInfoCollection videoDevices;
        private VideoCaptureDevice videoDevice;
        private VideoCapabilities[] videoCapabilities;
        private VideoCaptureDevice videoSource;

        public MainWindow()
        {
            InitializeComponent();
            videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
            if (videoDevices.Count == 0)
                throw new ApplicationException();
            ComboName.Items.Clear();
            foreach (FilterInfo device in videoDevices)
            {
                ComboName.Items.Add(device.Name);
            }
            ComboName.SelectedIndex = 0;
            //不是全局变量不成功
            videoSource = new VideoCaptureDevice(videoDevices[ComboName.SelectedIndex].MonikerString);
            for (int i = 0; i < videoSource.VideoCapabilities.Length; i++)
            {
                cbo_rate.Items.Add(videoSource.VideoCapabilities[i].FrameSize.Width + "*" + videoSource.VideoCapabilities[i].FrameSize.Height);
            }
            cbo_rate.SelectedIndex = 0;
            videoSource.VideoResolution = videoSource.VideoCapabilities[cbo_rate.SelectedIndex];
            videoSource.NewFrame += new NewFrameEventHandler(videoSource_NewFrame);
            videoSource.Start();

        }

        private void videoSource_NewFrame(object sender, NewFrameEventArgs eventArgs)
        {
            Bitmap bitmap = (Bitmap)eventArgs.Frame.Clone();
            Dispatcher.UIThread.Invoke(() =>
            {
               

                using (MemoryStream memory = new MemoryStream())
                {
                    bitmap.Save(memory, ImageFormat.Png);
                    memory.Position = 0;

                    //AvIrBitmap is our new Avalonia compatible image. You can pass this to your view
                    Avalonia.Media.Imaging.Bitmap AvIrBitmap = new Avalonia.Media.Imaging.Bitmap(memory);
                    Avalonia.Media.IImage? bitmapSource = null;
                    pictureBox1.Source = AvIrBitmap;
                }

               
            });
          
        }

       

        private void Cbo_camera_SelectionChanged(object? sender, SelectionChangedEventArgs e)
        {

            if (videoDevices.Count != 0)
            {
                //获取每个摄像头支持的分辨率
                videoDevice = new VideoCaptureDevice(videoDevices[ComboName.SelectedIndex].MonikerString);
                GetDeviceResolution(videoDevice);
            }
        }
        /// <summary>
        /// 获取每个摄像头支持的分辨率
        /// </summary>
        /// <param name="videoCaptureDevice"></param>
        private void GetDeviceResolution(VideoCaptureDevice videoCaptureDevice)
        {
            cbo_rate.Items.Clear();
            videoCapabilities = videoCaptureDevice.VideoCapabilities;
            foreach (VideoCapabilities capabilty in videoCapabilities)
            {
                cbo_rate.Items.Add($"{capabilty.FrameSize.Width} x {capabilty.FrameSize.Height}");
            }
            cbo_rate.SelectedIndex = 0;
        }
    }
}

运行效果(我遮挡了哈,长的太.....)

另外我封装了控件库,使用方法和网上旧版本一样。可以引入

AForgeNet.AvaloniaVideo

注意:旧版库不能使用,是netframework的,我已经编译新的版本,注意版本。

AForgeNet.AvaloniaVideo使用方法

1.引用包

<Window xmlns="https://github.com/avaloniaui"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:vm="using:AvaloniaApplication2.ViewModels"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
        xmlns:uc="clr-namespace:AForgeNet.AvaloniaVideo;assembly=AForgeNet.AvaloniaVideo"
        x:Class="AvaloniaApplication2.Views.MainWindow"
        x:DataType="vm:MainWindowViewModel"
        Icon="/Assets/avalonia-logo.ico"
        Title="AvaloniaApplication2">

    <Design.DataContext>
        <!-- This only sets the DataContext for the previewer in an IDE,
             to set the actual DataContext for runtime, set the DataContext property in code (look at App.axaml.cs) -->
        <vm:MainWindowViewModel/>
    </Design.DataContext>
  <Grid RowDefinitions="200,*"  ColumnDefinitions="200,200,200,200,*">
    <ComboBox Name="VideolistBox" Width="120" Grid.Row="0" Grid.Column="0"/>
    <ComboBox Name="cbo_rate" Width="120" Grid.Row="0" Grid.Column="1"/>
    <Button Name="buttonStart" Click="Button_Click" Width="120" Grid.Row="0" Grid.Column="2"/>
    <Button Name="buttonStop" Click="Button_Click_1" Width="120" Grid.Row="0" Grid.Column="3"/>
    <uc:VideoPlayer Name = "VideoSourcePlayer"  Grid.Row="1" Grid.ColumnSpan="4"/>
  </Grid>
 
</Window>

后台代码

using AForge.Imaging.Filters;
using AForge.Video;
using AForge.Video.DirectShow;
using Avalonia.Controls;
using Avalonia.Threading;
using SkiaSharp;
using System;

namespace AvaloniaApplication2.Views
{
    public partial class MainWindow : Window
    {
        private FilterInfoCollection videoDevices;
        private VideoCaptureDevice videoDevice;
        private VideoCapabilities[] videoCapabilities;
        private VideoCaptureDevice videoSource;
        public MainWindow()
        {
            InitializeComponent();
            videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
            if (videoDevices.Count == 0)
                throw new ApplicationException();
            VideolistBox.Items.Clear();
            foreach (FilterInfo device in videoDevices)
            {
                VideolistBox.Items.Add(device.Name);
            }
            VideolistBox.SelectedIndex = 0;
            videoSource = new VideoCaptureDevice(videoDevices[VideolistBox.SelectedIndex].MonikerString);
            for (int i = 0; i < videoSource.VideoCapabilities.Length; i++)
            {
                cbo_rate.Items.Add(videoSource.VideoCapabilities[i].FrameSize.Width + "*" + videoSource.VideoCapabilities[i].FrameSize.Height);
            }
            cbo_rate.SelectedIndex = 0;
            VideoSourcePlayer.NewFrame += VideoSourcePlayer_NewFrame;


        }

        private void VideoSourcePlayer_NewFrame(object sender, ref System.Drawing.Bitmap image)
        {
            //图像过滤
            FiltersSequence filter = new FiltersSequence();
            filter.Add(new Grayscale(0.2125, 0.7154, 0.0721));
            filter.Add(new Threshold(128));
            image=  filter.Apply(image);
        }

        private void Button_Click(object? sender, Avalonia.Interactivity.RoutedEventArgs e)
        {
            videoSource.VideoResolution = videoSource.VideoCapabilities[cbo_rate.SelectedIndex];
            VideoSourcePlayer.VideoSource = videoSource;
            VideoSourcePlayer.Start();
        }

        private void Button_Click_1(object? sender, Avalonia.Interactivity.RoutedEventArgs e)
        {
            VideoSourcePlayer.Stop();
        }
    }
}

运行效果

注释图像滤波处理

运行效果

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值