最简单的demo————WPF获取USB摄像头数据

WPF通过USB获取摄像头数据

最简单的demo————WPF获取USB摄像头数据

一、操作步骤
1、单击“检测”按钮
获取摄像头数据
2、在下拉框选择相应摄像头
3、单击“连接”按钮
就能看到摄像头的拍摄画面
4、点击“拍照”按钮
二、代码部分
新建WPF项目后
1、引入程序集
AForge.dll
AForge.Controls.dll
AForge.Imaging.dll
AForge.Video.dll
AForge.Video.DirectShow.dll
2、页面布局

<Window x:Class="viewtest2.MainWindow"
        xmlns:wfi ="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration"
        xmlns:aforge ="clr-namespace:AForge.Controls;assembly=AForge.Controls"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid Margin="0,0,-6.333,-0.333">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="13*"/>
            <ColumnDefinition Width="92*"/>
        </Grid.ColumnDefinitions>
        <Button Name="lj" Content="连接" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75" Margin="93.926,72,0,0" RenderTransformOrigin="2.165,0.731" Grid.Column="1" Click="lj_Click"/>
        <ComboBox Name="name1" HorizontalAlignment="Left" VerticalAlignment="Top" Width="120" Grid.ColumnSpan="2" Margin="10,70,0,0"/>
        <Button Name="jc" Content="检测" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75" Grid.Column="1" Margin="276.333,72,0,0" RenderTransformOrigin="0.436,0.529" Click="jc_Click"/>
        <wfi:WindowsFormsHost Margin="5,110,34.667,5" Grid.ColumnSpan="2">
            <aforge:VideoSourcePlayer x:Name="sourcePlayer0" Width="640" Height="480"></aforge:VideoSourcePlayer>
        </wfi:WindowsFormsHost>
        <WindowsFormsHost HorizontalAlignment="Left" Height="100" VerticalAlignment="Top" Width="156" Grid.Column="1" Margin="110.333,125,0,0"/>
        <Button Content="拍照" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75" Grid.Column="1" Margin="375.333,72,0,0" Click="Button_Click_1"/>

    </Grid>
</Window>

3、后台代码

 public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
        FilterInfoCollection a;//全局变量摄像头数据
        private void lj_Click(object sender, RoutedEventArgs e)
        {
            VideoCaptureDevice vcd= new VideoCaptureDevice(a[name1.SelectedIndex].MonikerString);
            vcd.DesiredFrameSize = new System.Drawing.Size(320, 240);
            vcd.DesiredFrameRate = 1;

            sourcePlayer0.VideoSource = vcd;
            sourcePlayer0.Start();
        }

        private void jc_Click(object sender, RoutedEventArgs e)
        {
           name1.Items.Clear();
            FilterInfoCollection fics;
            fics= new FilterInfoCollection(FilterCategory.VideoInputDevice);
            a = fics;
            foreach (FilterInfo fic in fics)
            {
                
                name1.Items.Add(fic .Name);
                //可以做出处理
            }
        }

        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            try
            {
                if (sourcePlayer0.IsRunning)
                {
                    BitmapSource bs= System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
                                    sourcePlayer0.GetCurrentVideoFrame().GetHbitmap(),
                                    IntPtr.Zero,
                                     Int32Rect.Empty,
                                    BitmapSizeOptions.FromEmptyOptions());
                    PngBitmapEncoder pbe= new PngBitmapEncoder();
                    pbe.Frames.Add(BitmapFrame.Create(bs));
                    string t = DateTime.Now.ToLongTimeString().ToString();
             
                    t = t.Replace("-","");
                    t = t.Replace(":","");
                    string jpgName = GetImagePath() + "\\" + t + ".jpg";
                    if (File.Exists(jpgName ))
                    {
                        File.Delete(jpgName );
                    }
                    using (Stream stream = File.Create(jpgName ))
                    {
                        pbe.Save(stream);
                    }
                    //拍照
                    if (sourcePlayer0 != null && sourcePlayer0.IsRunning)
                    {
                        MessageBox.Show("照片储存地址:" + picName);
                    }

                   
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("异常:" + ex.Message);
            }
        }
        private string GetImagePath()
        {

            string t = DateTime.Now.ToShortDateString().ToString();
            string ImgPath = System.IO.Path.GetDirectoryName(AppDomain.CurrentDomain.BaseDirectory)
                         + System.IO.Path.DirectorySeparatorChar.ToString() + "PersonImg";
            if (!Directory.Exists(ImgPath ))
            {
                Directory.CreateDirectory(ImgPath );
            }

            return ImgPath ;
        }
    }

在这里插入图片描述

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果你想在WPF项目中输出摄像头数据,可以使用WPF中提供的MediaElement控件结合Windows.Media命名空间中的CaptureElement类来实现。 以下是一个简单的示例,演示如何使用CaptureElement类来捕获摄像头数据,并将其显示在MediaElement控件中: 1. 添加一个MediaElement控件和一个CaptureElement控件到XAML中。例如: ``` <MediaElement x:Name="mediaElement" /> <CaptureElement x:Name="captureElement" /> ``` 2. 在代码中,使用Windows.Media.Capture命名空间中的MediaCapture类来初始化摄像头,并将其与CaptureElement控件关联。例如: ``` MediaCapture mediaCapture = new MediaCapture(); await mediaCapture.InitializeAsync(); captureElement.Source = mediaCapture; await mediaCapture.StartPreviewAsync(); ``` 3. 最后,将MediaElement控件的Source属性设置为CaptureElement控件的Source属性,以将摄像头数据显示在MediaElement控件中。例如: ``` mediaElement.Source = captureElement.Source; ``` 这样,你就可以在WPF项目中输出摄像头数据了。当然,这只是一个简单的示例,你可以根据自己的需要来自定义和扩展这个示例。 需要注意的是,如果你要在WPF中使用CaptureElement控件,需要在XAML文件的顶部添加以下命名空间引用: ``` xmlns:media="clr-namespace:System.Windows.Media;assembly=PresentationCore" ``` 然后,将CaptureElement控件的Stretch属性设置为Fill,以确保摄像头数据填充整个控件: ``` <CaptureElement x:Name="captureElement" Stretch="Fill" /> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值