使用Aforge 開發的攝像頭,有拍照,錄像,設置幀率,分辨率等,以及對視頻以及相機等的控制

先上圖,這是整個功能的界面: (這裏就連了兩個相機,如果想連接上百個,這裏提一句超級優化的方向,大家可以使用雙緩衝概念(是不是很懵?),其實說白了,就是多幅位圖繪製到一張位圖上顯示. 以前也是做實時繪製的時候,不知不覺就使用這種方式,直到後來,才聽到 雙緩衝 這個看似“高大上的”概念,真是倒騰概念.🙂)

 

 

 

首先聲明,裏面應該使用線程的方式,大家記得重新封裝,代替裏面的DispatcherTimer 。好,廢話不多說,我們開始.

一: 大家下載Aforge等的 dll ---> 添加到引用裏面.(在我的資源裏有,這個也是我調試了很多dll版本,才發現這個版本很穩定,其他dll版本,一言難盡)

 

 

, 

在後臺代碼裏 ,引入dll所在的命名空間.

using AForge.Video;
using AForge.Video.DirectShow;

using AForge.Video.FFMPEG;

 

 

二: 環境搭載完成後,我們來看xaml文件.

<Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"     
        xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
        xmlns:wfi="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WP_攝像頭AFore版本"
        xmlns:Intersoft="http://intersoft.clientui.com/schemas" 
        x:Class="WP_攝像頭AFore版本.MainWindow"
        Title="MainWindow" Height="550" Width="900" Loaded="Win_Loaded" Closed="Win_Cloded">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="4*"/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Border Grid.Row="0">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="5*"/>
                    <ColumnDefinition Width="4*"/>
                    <ColumnDefinition Width="5*"/>
                </Grid.ColumnDefinitions>
                <Border Grid.Column="0">
                    <GroupBox>
                        <GroupBox.Header>
                            <TextBlock><Run Text="左相機"/></TextBlock>
                        </GroupBox.Header>
                        <Grid>
                            <Grid.RowDefinitions>
                                <RowDefinition></RowDefinition>
                                <RowDefinition Height="50"></RowDefinition>
                            </Grid.RowDefinitions>
                            <Image x:Name="VceL">
                            </Image>
                            <Border Grid.Row="1">
                                <Grid>
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition Width="5*"></ColumnDefinition>
                                        <ColumnDefinition Width="3*"></ColumnDefinition>
                                        <ColumnDefinition></ColumnDefinition>
                                    </Grid.ColumnDefinitions>
                                    <Label x:Name="TextBlocL" VerticalContentAlignment="Center" HorizontalContentAlignment="Left"></Label>
                                    <Label Grid.Column="1" x:Name="fps_L" VerticalContentAlignment="Center" HorizontalContentAlignment="Left"></Label>
                                    <Label Grid.Column="2" Content="fps" VerticalContentAlignment="Center"></Label>
                                </Grid>
                            </Border>
                            <!--<Canvas >
                                <wfi:WindowsFormsHost>
                                    <local:UserControl11 x:Name="User1"></local:UserControl11>
                                </wfi:WindowsFormsHost>
                            </Canvas>-->                                                       
                        </Grid>
                    </GroupBox>
                </Border>
                <Border Grid.Column="1" BorderBrush="LightGray" BorderThickness="0.5">
                    <Grid ShowGridLines="False">
                        <Grid.RowDefinitions>
                            <RowDefinition/>
                            <RowDefinition/>
                            <RowDefinition/>
                            <RowDefinition/>
                            <RowDefinition/>
                            <RowDefinition/>
                        </Grid.RowDefinitions>
                        <Border Grid.Row="0">
                            <GroupBox>
                                <GroupBox.Header>
                                    <TextBlock><Run Text="視頻設備"/></TextBlock>
                                </GroupBox.Header>
                                <Grid>
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition/>
                                        <ColumnDefinition/>
                                    </Grid.ColumnDefinitions>
                                    <Border Grid.Column="0" Margin="5">
                                        <DockPanel LastChildFill="True">
                                            <Label HorizontalContentAlignment="Center" DockPanel.Dock="Left" Content="L"/>
                                            <ComboBox x:Name="Combox_L" Margin="0,5,0,5" SelectionChanged="Combox_L_SelectionChanged"/>
                                        </DockPanel>
                                    </Border>
                                    <Border Grid.Column="1" Margin="5">
                                        <DockPanel LastChildFill="True" FlowDirection="RightToLeft">
                                            <Label HorizontalContentAlignment="Center" DockPanel.Dock="Left" Content="R"/>
                                            <ComboBox FlowDirection="LeftToRight" x:Name="Combox_R" Margin="0,5,0,5"  SelectionChanged="Combox_R_SelectionChanged"/>
                                        </DockPanel>
                                    </Border>
                                </Grid>
                            </GroupBox>
                        </Border>
                        <Border Grid.Row="1">
                            <GroupBox>
                                <GroupBox.Header>
                                    <TextBlock Text="視頻操作"/>
                                </GroupBox.Header>
                                <Grid>
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition/>
                                        <ColumnDefinition Width="25"/>
                                        <ColumnDefinition/>
                                    </Grid.ColumnDefinitions>
                                    <Border Grid.Column="0"  Margin="5">
                                        <Button x:Name="Open_Vedio" Click="Open_VedioClick" Content="打開視頻"/>
                                    </Border>
                                    <Border Grid.Column="2"  Margin="5">
                                        <Button x:Name="Close_vedio" Click="Close_vedioClick" Content="關閉視頻"/>
                                    </Border>
                                </Grid>
                            </GroupBox>

                        </Border>
                        <Border Grid.Row="2">
                            <GroupBox>
                                <GroupBox.Header>
                                    <TextBlock><Run Text="拍照操作"/></TextBlock>
                                </GroupBox.Header>
                                <Grid>
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition/>
                                        <ColumnDefinition/>
                                    </Grid.ColumnDefinitions>
                                    <Border Grid.Column="0" Margin="5">
                                        <Button Click="photos_Click" Content="拍照"/>
                                    </Border>
                                    <Border Grid.Column="1">
                                        <DockPanel>
                                            <Label Content="圖格式" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
                                            <ComboBox x:Name="cmbImageFormat" Margin="0,5,0,5" SelectionChanged="cmbImageFormat_SelectionChanged" VerticalContentAlignment="Center"
                                                      HorizontalContentAlignment="Left">
                                              
                                            </ComboBox>
                                        </DockPanel>
                                    </Border>
                                </Grid>
                            </GroupBox>
                        </Border>
                        <Border Grid.Row="3">
                            <GroupBox>
                                <GroupBox.Header>
                                    <TextBlock Text="錄像操作"/>
                                </GroupBox.Header>
                                <Grid>
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition/>
                                        <ColumnDefinition/>
                                    </Grid.ColumnDefinitions>
                                    <Border Grid.Column="0" Margin="5">
                                        <Button Content="開始錄像" Click="Statr_recordClick"/>
                                    </Border>
                                    <Border Grid.Column="1" Margin="5">
                                        <Button Content="停止錄像" Click="Stop_recordClick"/>
                                    </Border>
                                </Grid>
                            </GroupBox>

                        </Border>
                        <Border Grid.Row="4">
                            <GroupBox>
                                <GroupBox.Header>
                                    <TextBlock Text="幀率設置"/>
                                </GroupBox.Header>
                                <Grid>
                                    <DockPanel Margin="5">
                                        <Label HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Content="幀率設定"/>
                                        <TextBox x:Name="Set_boxFrame" Text="25" VerticalContentAlignment="Center" HorizontalContentAlignment="Left"/>
                                    </DockPanel>
                                </Grid>
                            </GroupBox>
                        </Border>
                        <Border Grid.Row="5">
                            <GroupBox>
                                <GroupBox.Header>
                                    <TextBlock Text="視頻設置"/>
                                </GroupBox.Header>
                                <Grid>
                                    <DockPanel>
                                        <Label VerticalContentAlignment="Center" Content="分辨率"/>
                                        <ComboBox x:Name="resolutionCombox" VerticalContentAlignment="Center" HorizontalContentAlignment="Left" Margin="5" SelectionChanged="resolutionCombox_SelectionChanged"/>
                                    </DockPanel>
                                </Grid>
                            </GroupBox>
                        </Border>
                    </Grid>
                </Border>
                <Border Grid.Column="2">
                    <GroupBox FlowDirection="RightToLeft">
                        <GroupBox.Header>
                            <TextBlock><Run Text="右相機"/></TextBlock>
                        </GroupBox.Header>
                        <Grid>
                            <Grid.RowDefinitions>
                                <RowDefinition></RowDefinition>
                                <RowDefinition Height="50"></RowDefinition>
                            </Grid.RowDefinitions>
                            <Image x:Name="VceR" >
                                <!--<Image.RenderTransform>
                                    <RotateTransform Angle="90"></RotateTransform>
                                </Image.RenderTransform>-->
                            </Image>
                            <Border Grid.Row="1" FlowDirection="LeftToRight">
                                <Grid>
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition Width="5*"></ColumnDefinition>
                                        <ColumnDefinition Width="3*"></ColumnDefinition>
                                        <ColumnDefinition></ColumnDefinition>
                                    </Grid.ColumnDefinitions>
                                    <Label x:Name="TextBlocR" VerticalContentAlignment="Center" HorizontalContentAlignment="Left"></Label>
                                    <Label Grid.Column="1" x:Name="fps_R" VerticalContentAlignment="Center" HorizontalContentAlignment="Left"></Label>
                                    <Label Grid.Column="2" Content="fps" VerticalContentAlignment="Center"></Label>
                                </Grid>
                            </Border>
                        </Grid>
                    </GroupBox>
                </Border>
            </Grid>
        </Border>
        <Border Grid.Row="1">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="3*"/>
                    <ColumnDefinition Width="2*"/>
                    <ColumnDefinition Width="3*"/>
                </Grid.ColumnDefinitions>
                <Border Grid.Column="0" Margin="3">
                    <DockPanel Margin="30,0,30,0">
                        <Button Width="50" Height="20" DockPanel.Dock="Top" VerticalAlignment="Top" Content="T" Click="Button_Click_5"/>
                        <Button Width="50" Height="20" DockPanel.Dock="Bottom" VerticalAlignment="Bottom" Content="B" Click="Button_Click_7"/>
                        <Button Width="50" Height="20" DockPanel.Dock="Left" HorizontalAlignment="Left" Content="L" Click="Button_Click_4"/>
                        <Button Width="50" Height="20" DockPanel.Dock="Left" HorizontalAlignment="Right" Content="R" Click="Button_Click_6"/>

                    </DockPanel>
                </Border>
                <Border Grid.Column="1">
                    <StackPanel>
                        <Button Margin="2" Content="檢測" Click="Check_demoClick"/>
                        <Button x:Name="VideoSourceSet" Content="視頻源設置" Margin="2" Click="VideoSourceSet_Click"></Button>
                        <Button Visibility="Collapsed" Content="Demo" Margin="2" />
                        <Button Visibility="Collapsed" Content="Demo2" Margin="2"/>
                        
                    </StackPanel>
                </Border>
                <Border Grid.Column="2" Margin="3">
                    <DockPanel Margin="30,0,30,0">
                        <Button Width="50" Height="20" DockPanel.Dock="Top" VerticalAlignment="Top" Content="T" Click="Button_Click_1"/>
                        <Button Width="50" Height="20" DockPanel.Dock="Bottom" VerticalAlignment="Bottom" Content="B" Click="Button_Click_3"/>
                        <Button Width="50" Height="20" DockPanel.Dock="Left" HorizontalAlignment="Left" Content="L" Click="Button_Click"/>
                        <Button Width="50" Height="20" DockPanel.Dock="Left" HorizontalAlignment="Right" Content="R" Click="Button_Click_2"/>
                    </DockPanel>
                </Border>
            </Grid>
        </Border>
    </Grid>
</Window>

因爲這個Aforge,貌似只放在winform空間裏,爲了不使用那個winformhost,我們就創建兩個  form 中的自定義控件,來承載AForge上傳過來的視頻圖像.(反正兩種方式都可以,就是宿主窗口,這裏爲了省事.)

上面兩個userControl2.cs,都只是一個form控件.

我們來看其後臺代碼:

namespace WP_攝像頭AFore版本
{
    public partial class UserControl2 : UserControl
    {
        public UserControl2()
        {
            InitializeComponent();
        }
        public AForge.Controls.VideoSourcePlayer getvideoSourcePlayer2
        {
            get
            {
                return videoSourcePlayer2;
            }
            set
            {
                videoSourcePlayer2 = value;
            }
        }
    }
}


/////這裏式usercontrol1() 的後臺代碼
namespace WP_攝像頭AFore版本
{
    public partial class UserControl11 : UserControl
    {
        public UserControl11()
        {
            InitializeComponent();
          //  rotateTransform = new RotateTransform(180, getvideoSourcePlayer1.Width / 2, getvideoSourcePlayer1.Height / 2);//180度
           
        }
        
      //  public RotateTransform rotateTransform;
        public AForge.Controls.VideoSourcePlayer getvideoSourcePlayer1
        {
            get
            {
                return videoSourcePlayer1;
            }
            set
            {
                videoSourcePlayer1 = value;
            }
        }

    }
}


準備工作完成之後,我們來看主界面功能的實現:  注意啊:下面代碼太長了,我沒有整理,大家就對應着前面的xaml界面中的功能, 自己選擇 ....


//一些變量.
 public static  string Path_DicPhone = System.AppDomain.CurrentDomain.BaseDirectory + @"Phone";
        public static  string Path_DicPhoneL = System.AppDomain.CurrentDomain.BaseDirectory + @"Phone\Image_L";
        public static string Path_DicPhoneR = System.AppDomain.CurrentDomain.BaseDirectory + @"Phone\Image_R";
        public static string Path_DicVideoL = System.AppDomain.CurrentDomain.BaseDirectory + @"Video\Video_L";
        public static string Path_DicVideoR = System.AppDomain.CurrentDomain.BaseDirectory + @"Video\Video_R";

        public string imageExt;
        public FilterInfoCollection videoDevices;
        private Stopwatch stopWatch = null;

        /// <summary>
        /// 等研究一下這個東西 視頻設置分辨率方面
        /// </summary>
         public VideoCapabilities videoCapability;

        public List<string> deviceName = new List<string>();

        public DispatcherTimer dispather = new DispatcherTimer();
        public DispatcherTimer dispather2 = new DispatcherTimer();
        public DispatcherTimer dispather_fps = new DispatcherTimer();

        public UserControl11 User1 = new UserControl11();
        public UserControl2 User2 = new UserControl2();

        public VideoFileWriter videoWriterL = null;
        public VideoFileWriter videoWriterR = null;
        private bool createNewFile = true;
        private bool createNewFile2 = true;


//這裏是初始化功能. 在界面加載的時候

private void Win_Loaded(object sender, RoutedEventArgs e)
 {
            initVideo();

            initDirectoryLR();

            dispather.Tick += new EventHandler(despatherTimer_Tick);
            dispather.Interval = new TimeSpan(0);

            dispather2.Tick += new EventHandler(despatherTimer_Tick2);
            dispather2.Interval = new TimeSpan(0);

            dispather_fps.Tick += new EventHandler(despatherTimer_TickFps);
            dispather_fps.Interval = new TimeSpan(0);

          
            
  }


    //初始化攝像頭,獲取可用設備.
     private void initVideo()
        {

            
            Combox_L.ItemsSource = null;
            Combox_R.ItemsSource = null;
            deviceName.Clear();
            try
            {
                videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
                if(videoDevices.Count <=0)
                {
                    MessageBox.Show("沒有檢測到任何攝像頭");
                    return;
                }
                else
                {

                    for(int i =0;i<videoDevices.Count;i++)
                    {
                        deviceName.Add(videoDevices[i].Name);
                    }
                     Combox_L.ItemsSource = Combox_R.ItemsSource = deviceName;

                     if(videoDevices.Count>1)
                     {
                         Combox_L.SelectedIndex = 0;
                         Combox_R.SelectedIndex = 1;
                         
                         if(Combox_L.IsEnabled == false)
                         {
                             Combox_L.IsEnabled = true;
                         }
                         if (Combox_R.IsEnabled == false)
                         {
                             Combox_R.IsEnabled = true;
                         }
                        
                     }
                     else
                     {
                         Combox_L.SelectedIndex = 0;
                         if(Combox_R.IsEnabled == true)
                            Combox_R.IsEnabled = false;
                     }      
                }
                

            }
            catch(exception ex)
            {
                throw(ex.message);
            }

           
          

        }

 public void initDirectoryLR()
        {
            //這裏初始化的時候,創建文件夾
            if (!Directory.Exists(Path_DicPhone))
            {
                Directory.CreateDirectory(Path_DicPhone);
            }
            if (!Directory.Exists(Path_DicPhoneL))
            {
                Directory.CreateDirectory(Path_DicPhoneL);
            }
            if (!Directory.Exists(Path_DicPhoneR))
            {
                Directory.CreateDirectory(Path_DicPhoneR);
            }

            if (!Directory.Exists(Path_DicVideoL))
            {
                Directory.CreateDirectory(Path_DicVideoL);
            }
            if (!Directory.Exists(Path_DicVideoR))
            {
                Directory.CreateDirectory(Path_DicVideoR);
            }


            //這裏給其加載圖像格式
            string[] formats = new string[] { "jpg", "png", "bmp", "icon", "emf", "tiff", "wmf", "exif", "gif" };  //, "memorybmp"
            cmbImageFormat.ItemsSource = formats;
            cmbImageFormat.SelectedIndex = 0;
            getimageFormat = ImageFormat.Jpeg;
            imageExt = @".jpg";

            //這裏添加視頻格式
            videoSource1 = new VideoCaptureDevice(videoDevices[Combox_L.SelectedIndex].MonikerString);
            User1.getvideoSourcePlayer1.VideoSource = videoSource1;
            videoSource1.NewFrame += new NewFrameEventHandler(LmyCaptureDevice_NewFrame);

            foreach (VideoCapabilities videoCap in videoSource1.VideoCapabilities)
            {
                resolutionCombox.Items.Add(videoCap.FrameSize.Width + "x" + videoCap.FrameSize.Height);
            }

            resolutionCombox.SelectedIndex = 0;

            if (videoSource1.VideoCapabilities.Length>0)
            {
                videoCapability = videoSource1.VideoCapabilities[0];
            }
          
         

        }


//註冊回調函數

public void  despatherTimer_Tick(object sender, EventArgs e)
        {
            if (getbit != null)
            {
                image_to_where(getbit, sige_Chek.sige_L);
                TextBlocL.Content = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                //這裏和上面那個Image都能錄製
                //先嚐試一下這邊這個
             
                #region
                if (StopERC_L)
                {

                    //停止錄製
                    createNewFile = true;
                    StopERC_L = true;
                    Set_boxFrame.IsEnabled = true;
                    if (videoWriterL != null)
                    {
                        videoWriterL.Close();
                        videoWriterL.Dispose();
                    } 
                    
                }
                else
                {
                    //開始錄製

                    try
                    {
                        _frameRate = int.Parse(Set_boxFrame.Text.ToString());
                    }
                    catch
                    {
                        _frameRate = 25;
                    }
                    Set_boxFrame.IsEnabled = false;

                    if (createNewFile)
                    {
                        videoFileName = DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss") + @".avi";
                        createNewFile = false;
                        try
                        {
                            videoFilePath_L = Path_DicVideoL + @"\" + videoFileName;
                            if (videoWriterL != null)
                            {
                                videoWriterL.Close();
                                videoWriterL.Dispose();
                            }
                            videoWriterL = new AForge.Video.FFMPEG.VideoFileWriter();
                            videoWriterL.Open(videoFilePath_L, getbit.Width, getbit.Height, _frameRate, AForge.Video.FFMPEG.VideoCodec.MPEG4);
                            videoWriterL.WriteVideoFrame(getbit);
                        }
                        catch
                        {

                        }

                    }
                    videoWriterL.WriteVideoFrame(getbit);
                }
                #endregion
            }
            else
            {
                image_to_where(getbit2, sige_Chek.sige_L);
            }
        }
   public void despatherTimer_Tick2(object sender, EventArgs e)
        {
            if (getbit3 != null)
            {
                image_to_where(getbit3, sige_Chek.sige_R);
                TextBlocR.Content = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                
               
                #region
                if (StopERC_R)
                {

                    //停止錄製
                    createNewFile2 = true;
                    StopERC_R = true;
                   
                    if(Set_boxFrame.IsEnabled == false)
                        Set_boxFrame.IsEnabled = true;
                    
                    if (videoWriterR != null)
                    {
                        videoWriterR.Close();
                        videoWriterR.Dispose();
                    }

                }
                else
                {
                    //開始錄製

                    try
                    {
                        _frameRate = int.Parse(Set_boxFrame.Text.ToString());
                    }
                    catch
                    {
                        _frameRate = 25;
                    }
                    if (Set_boxFrame.IsEnabled == true)
                         Set_boxFrame.IsEnabled = false;

                    if (createNewFile2)
                    {
                        createNewFile2 = false;
                        try
                        {
                            videoFilePath_R = Path_DicVideoR + @"\" + DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss") + @".avi";
                            if (videoWriterR != null)
                            {
                                videoWriterR.Close();
                                videoWriterR.Dispose();
                            }
                            videoWriterR = new AForge.Video.FFMPEG.VideoFileWriter();
                            videoWriterR.Open(videoFilePath_R, getbit3.Width, getbit3.Height, _frameRate, AForge.Video.FFMPEG.VideoCodec.MPEG4);
                            videoWriterR.WriteVideoFrame(getbit3);
                        }
                        catch
                        {

                        }

                    }
                    videoWriterR.WriteVideoFrame(getbit3);
                }
                #endregion
            }
            else
            {
                image_to_where(getbit4, sige_Chek.sige_R);
            }
        }

 /// <summary>
        /// fps
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        public void despatherTimer_TickFps(object sender, EventArgs e)
        {
            //這裏是左面相機的幀率
            int framesReceived = videoSource1.FramesReceived;
            int framesReceived2 = videoSource2.FramesReceived;
            if (stopWatch == null)
            {
                stopWatch = new Stopwatch();
                stopWatch.Start();
            }
            else
            {
               
                stopWatch.Stop();
                float fps = 1000f * framesReceived / stopWatch.ElapsedMilliseconds;
                fps_L.Content = (fps).ToString();

                float fps2 = 1000f * framesReceived2 / stopWatch.ElapsedMilliseconds;
                fps_R.Content = (fps2).ToString();

                stopWatch.Reset();
                stopWatch.Start();
            }
        }



 /// <summary>
        /// 獲取所有攝像頭設備
        /// </summary>
        /// <returns></returns>
        public FilterInfoCollection GetDevices()
        {
            try
            {
                //枚舉所有視頻輸入設備
                FilterInfoCollection videoDevice = new FilterInfoCollection(FilterCategory.VideoInputDevice);
                if (videoDevice.Count != 0)
                {
                    return videoDevice;
                }
                else
                    return null;
            }
            catch (Exception ex)
            {
                return null;
            }
        }


 private void Open_VedioClick(object sender, RoutedEventArgs e)
        {
            StartCameras();
        }

public VideoCaptureDevice myCaptureDevice = null;
        public VideoCaptureDevice videoSource1;
        public VideoCaptureDevice videoSource2;
        public void StartCameras()
        {
            //左相機

            if (Combox_L.IsEnabled == true)
            {
                //videoSource1 = new VideoCaptureDevice(videoDevices[Combox_L.SelectedIndex].MonikerString);
                //User1.getvideoSourcePlayer1.VideoSource = videoSource1;
                //videoSource1.NewFrame += new NewFrameEventHandler(LmyCaptureDevice_NewFrame);
                videoSource1.VideoResolution = videoCapability;
                User1.getvideoSourcePlayer1.Start();
                dispather.Start();
                
                fps_L.Content = videoSource1.FramesReceived.ToString();
               
               
            }
            
            //右面相機
            if (Combox_R.IsEnabled == true)
            {
                videoSource2 = new VideoCaptureDevice(videoDevices[Combox_R.SelectedIndex].MonikerString);
                User2.getvideoSourcePlayer2.VideoSource = videoSource2;
                videoSource2.NewFrame += new NewFrameEventHandler(RmyCaptureDevice_NewFrame);
                videoSource2.VideoResolution = videoCapability;
                User2.getvideoSourcePlayer2.Start();
                dispather2.Start();
                fps_R.Content = videoSource2.FramesReceived.ToString(); //最後,這連個東西落在定時器裏面
            }

           // dispather_fps.Start();
            //分辨率的選擇框框灰色
            if(resolutionCombox.IsEnabled == true)
                resolutionCombox.IsEnabled = false;

        }


    public long bbb = 0;
        public Bitmap getbit;
        public Bitmap getbit2;

        public Bitmap getbit3;
        public Bitmap getbit4;
       
        public Graphics g;
        public Graphics g2;
      
        public System.Drawing.Bitmap bitmap;
        public System.Drawing.Bitmap bitmap2;

        private string drawDate = string.Empty;
        public bool StopERC_L = true;
        public bool StopERC_R = true;

        /// <summary>
        /// 這個是錄製的文件的時間名字
        /// </summary>
        public string videoFileName = string.Empty;

        public string videoFilePath_L = string.Empty;
        public string videoFilePath_R = string.Empty;

      
        private int _frameRate = 25;  //默認幀率
        /// <summary>
        /// 這東西能獲取圖像
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="eventArgs"></param>
        public void LmyCaptureDevice_NewFrame(object sender, NewFrameEventArgs eventArgs)
        {
            try
            {
              bitmap = (System.Drawing.Bitmap)eventArgs.Frame.Clone();
              //getbit = (System.Drawing.Bitmap)eventArgs.Frame.Clone();
              getbit2 = (System.Drawing.Bitmap)eventArgs.Frame.Clone();

               


                #region  這裏是對視頻上添加一些自己想要的東西 添加水印
                g = Graphics.FromImage(bitmap);
              // g.RotateTransform(180);
              //g.DrawImage(bitmap, 0, 0);


                SolidBrush drawBrush = new SolidBrush(System.Drawing.Color.Red);
                Font drawFont = new Font("Arial", 6, System.Drawing.FontStyle.Bold, GraphicsUnit.Millimeter);
                int xPos = bitmap.Width - (bitmap.Width - 15);
                int yPos = 10;
                drawDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                g.DrawString(drawDate, drawFont, drawBrush, xPos, yPos);
                getbit = bitmap;
                Console.WriteLine("NO " + (bbb++).ToString());
               // g.Dispose();
                #endregion
            }
            catch
            {
                return;
            }
        }

 public void RmyCaptureDevice_NewFrame(object sender, NewFrameEventArgs eventArgs)
        {
            try
            {
                bitmap2 = (System.Drawing.Bitmap)eventArgs.Frame.Clone();
                getbit3 = (System.Drawing.Bitmap)eventArgs.Frame.Clone();
                getbit4 = (System.Drawing.Bitmap)eventArgs.Frame.Clone();
              
              //  g2 = Graphics.FromImage(bitmap2);
               // g2.RotateTransform(180);
               // g2.DrawImage(bitmap2, 0, 0);
                // image_to_where(bitmap, VceR);
              //  g2.Clear(System.Drawing.Color.Black);
              //g2.Dispose();
            }
            catch
            {
                return;
            }
        }
 /// 開始錄像
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Statr_recordClick(object sender, RoutedEventArgs e)
        {
            StopERC_L = false;
            StopERC_R = false;
        }

        /// <summary>
        /// 停止錄像
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Stop_recordClick(object sender, RoutedEventArgs e)
        {
            StopERC_L =true;
            StopERC_R = true;
        }

public enum sige_Chek
        {
            sige_L,
            sige_R
        }
       public void image_to_where(Bitmap bb,sige_Chek sige)
        {
       
            //if(bb == null) return;

            try
            {              
                System.Drawing.Image b_demo2 = bb;
                System.IO.MemoryStream ms = new System.IO.MemoryStream();
                b_demo2.Save(ms, System.Drawing.Imaging.ImageFormat.Png);

            System.Windows.Media.Imaging.BitmapImage bi = new System.Windows.Media.Imaging.BitmapImage();
            bi.BeginInit();
            bi.StreamSource = new MemoryStream(ms.ToArray());
            bi.EndInit();

           
            this.Dispatcher.Invoke(new Action(delegate
            {
              //SetValue(RenderOptions.BitmapScalingModeProperty, BitmapScalingMode.HighQuality);
                if (sige == sige_Chek.sige_R)
                {                  
                    rotateTransform2 = new RotateTransform(setAngel, VceL.ActualWidth / 2, VceL.ActualHeight / 2);//180度
                    VceR.RenderTransform = rotateTransform2;
                    VceR.Source = bi;
                }
                if(sige == sige_Chek.sige_L)
                {
                                    
                    rotateTransform2 = new RotateTransform(setAngel2, VceL.ActualWidth / 2, VceL.ActualHeight / 2);//180度
                    VceL.RenderTransform = rotateTransform2;
                    VceL.Source = bi;
                }
               
                                
            }));
            }
            catch
            {

            }
        }
       public RotateTransform rotateTransform;
       public RotateTransform rotateTransform2;

 public static int setAngel = 270;
       public static int setAngel2 = 90;
       public void myCaptureDevice_NewFrame(object sender, NewFrameEventArgs eventArgs)
        {
            
            System.Drawing.Bitmap bitmap = (System.Drawing.Bitmap)eventArgs.Frame.Clone();
            
          
            System.Drawing.Image b_demo = bitmap.Clone(
            new RectangleF((bitmap.Size.Width - 295) / 2, (bitmap.Size.Height - 413) / 2, 100,100), //顯示圖像的寬度爲295像素,高度爲413像素
              System.Drawing.Imaging.PixelFormat.Format32bppRgb);
            
            
            System.IO.MemoryStream ms = new System.IO.MemoryStream();
            b_demo.Save(ms, System.Drawing.Imaging.ImageFormat.Png);

          

            System.Windows.Media.Imaging.BitmapImage bi = new System.Windows.Media.Imaging.BitmapImage();
            bi.BeginInit();
            bi.StreamSource = new MemoryStream(ms.ToArray());
            bi.EndInit();
            RotateTransform rotateTransform;

            this.Dispatcher.Invoke(new Action(delegate
            {
                //SetValue(RenderOptions.BitmapScalingModeProperty, BitmapScalingMode.HighQuality);

                this.VceR.Source = bi;
               // rotateTransform = new RotateTransform(0, VceR.ActualWidth / 2, VceR.ActualHeight / 2);//180度
              //  VceR.RenderTransform = rotateTransform;//圖片控件旋轉


            }));
          // this.VceR.Dispatcher.Invoke(new Action(() => { this.VceR.Source = bi; }));
            
            ms.Close();

        }

 private void Close_vedioClick(object sender, RoutedEventArgs e)
        {
            User1.getvideoSourcePlayer1.SignalToStop();
            User1.getvideoSourcePlayer1.WaitForStop();
            dispather.Stop();
            if(g!=null)
             g.Dispose();

            User2.getvideoSourcePlayer2.SignalToStop();
            User2.getvideoSourcePlayer2.WaitForStop();
            dispather2.Stop();
            if(g2!=null)
             g2.Dispose();

            //fps 幀率的獲取

          //  dispather_fps.Stop();
         
            if (resolutionCombox.IsEnabled == false)
                resolutionCombox.IsEnabled = true;

        }
        private void photos_Click(object sender, RoutedEventArgs e)
        {

            //兩種都可以,隨意取捨
            PhotoImage(VceL,sige_Chek.sige_L);
            ClipSaveBmp(VceL, sige_Chek.sige_L);

            PhotoImage(VceR,sige_Chek.sige_R);
            ClipSaveBmp(VceR,sige_Chek.sige_R);
        }
        private string fileName = "";
        public RenderTargetBitmap bmp;
        public void PhotoImage(FrameworkElement vce,sige_Chek sign)
        {
            try
            {
                bmp = new RenderTargetBitmap((int)vce.ActualWidth, (int)vce.ActualHeight, 96, 96, PixelFormats.Default);
            }
            catch
            {
                return;
            }
            vce.Measure(vce.RenderSize);
           // vce.Arrange(new Rect(vce.RenderSize));
            bmp.Render(vce);

            BitmapEncoder encoder = new JpegBitmapEncoder();

            encoder.Frames.Add(BitmapFrame.Create(bmp));
            using (MemoryStream ms = new MemoryStream())
            {
                encoder.Save(ms);
                byte[] captureData = ms.ToArray();
                if (sign == sige_Chek.sige_L)
                {
                    fileName = Path_DicPhoneL +@"\L"+ DateTime.Now.ToString("yyyyMMddHHmmss") + @".jpg";
                }
                if(sign == sige_Chek.sige_R)
                {
                    fileName = Path_DicPhoneR + @"\R" + DateTime.Now.ToString("yyyyMMddHHmmss") + @".jpg";
                }

                File.WriteAllBytes(fileName, captureData);
            }
        }
        public ImageFormat getimageFormat;

  public void ClipSaveBmp(FrameworkElement vce, sige_Chek sign)
        {
            try
            {
                if (sign == sige_Chek.sige_L)
                {
                    fileName = Path_DicPhoneL + @"\L" + DateTime.Now.ToString("yyyyMMddHHmmss") + imageExt;
                    getbit.Save(fileName, getimageFormat);
                }
                else
                {
                    fileName = Path_DicPhoneR + @"\R" + DateTime.Now.ToString("yyyyMMddHHmmss") + imageExt;
                    getbit3.Save(fileName, getimageFormat);
                }
            }
            catch
            {
                MessageBox.Show("請打開攝像頭");
                return;
            }
        }

   private void Combox_L_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {

        }

        private void Combox_R_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {

        }

        private void Check_demoClick(object sender, RoutedEventArgs e)
        {
            initVideo();
        }

        private void Wnd_Cloded(object sender, EventArgs e)
        {
           if(myCaptureDevice!=null)
           {
               if(myCaptureDevice.IsRunning)
               {
                   myCaptureDevice.SignalToStop();
               }

               myCaptureDevice = null;
           }


           User1.getvideoSourcePlayer1.Stop();
           dispather.Stop();
           g.Dispose();

           User2.getvideoSourcePlayer2.Stop();
           dispather2.Stop();
           g2.Dispose();

        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            setAngel = 0;
            rotateTransform = new RotateTransform(setAngel, VceR.ActualWidth / 2, VceR.ActualHeight / 2);//180度
            VceR.RenderTransform = rotateTransform;
        }

        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            setAngel = 270;
            rotateTransform = new RotateTransform(setAngel, VceR.ActualWidth / 2, VceR.ActualHeight / 2);//180度
            VceR.RenderTransform = rotateTransform;
        }

        private void Button_Click_2(object sender, RoutedEventArgs e)
        {
            setAngel = 180;
            rotateTransform = new RotateTransform(setAngel, VceR.ActualWidth / 2, VceR.ActualHeight / 2);//180度
            VceR.RenderTransform = rotateTransform;
        }

        private void Button_Click_3(object sender, RoutedEventArgs e)
        {
            setAngel = 90;
            rotateTransform = new RotateTransform(setAngel, VceR.ActualWidth / 2, VceR.ActualHeight / 2);//180度
            VceR.RenderTransform = rotateTransform;
        }

        private void Button_Click_4(object sender, RoutedEventArgs e)
        {
            setAngel2 = 0;
            rotateTransform2 = new RotateTransform(setAngel2, VceL.ActualWidth / 2, VceL.ActualHeight / 2);//180度
            VceL.RenderTransform = rotateTransform2;
        }

        private void Button_Click_5(object sender, RoutedEventArgs e)
        {
            setAngel2 = 90;
            rotateTransform2 = new RotateTransform(setAngel2, VceL.ActualWidth / 2, VceL.ActualHeight / 2);//180度
            VceL.RenderTransform = rotateTransform2;
        }

        private void Button_Click_6(object sender, RoutedEventArgs e)
        {
            setAngel2 = 180;
            rotateTransform2 = new RotateTransform(setAngel2, VceL.ActualWidth / 2, VceL.ActualHeight / 2);//180度
            VceL.RenderTransform = rotateTransform2;
        }

        private void Button_Click_7(object sender, RoutedEventArgs e)
        {
            setAngel2 = 270;
            rotateTransform2 = new RotateTransform(setAngel2, VceL.ActualWidth / 2, VceL.ActualHeight / 2);//180度
            VceL.RenderTransform = rotateTransform2;
        }

        private void Win_Cloded(object sender, EventArgs e)
        {
            User1.getvideoSourcePlayer1.SignalToStop();
            User1.getvideoSourcePlayer1.WaitForStop();
            dispather.Stop();
            if(g!=null)
                g.Dispose();


            User2.getvideoSourcePlayer2.SignalToStop();
            User2.getvideoSourcePlayer2.WaitForStop();
            dispather2.Stop();
            if (g2 != null)
             g2.Dispose();
        }

        private void cmbImageFormat_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (cmbImageFormat.Items.Count <= 0)
                return;

            string formatType = cmbImageFormat.SelectedItem.ToString();
            SelectedImageFormat(formatType);
        }
        private void SelectedImageFormat(string formatType)
        {
            switch (formatType)
            {
                case "jpg":
                    getimageFormat = ImageFormat.Jpeg;
                    imageExt = ".jpg";
                    break;
                case "bmp":
                    getimageFormat = ImageFormat.Bmp;
                    imageExt = ".bmp";
                    break;
                case "gif":
                    getimageFormat = ImageFormat.Gif;
                    imageExt = ".gif";
                    break;
                case "png":
                    getimageFormat = ImageFormat.Png;
                    imageExt = ".png";
                    break;
                case "tiff":
                    getimageFormat = ImageFormat.Tiff;
                    imageExt = ".tiff";
                    break;
                case "icon":
                    getimageFormat = ImageFormat.Icon;
                    imageExt = ".ico";
                    break;
                case "emf":
                    getimageFormat = ImageFormat.Emf;
                    imageExt = ".emf";
                    break;
                case "wmf":
                    getimageFormat = ImageFormat.Wmf;
                    imageExt = ".wmf";
                    break;
                case "exif":
                    getimageFormat = ImageFormat.Exif;
                    imageExt = ".exif";
                    break;
                default:
                    getimageFormat = ImageFormat.Jpeg;
                    imageExt = ".jpg";
                    break;

            }
        }

        /// <summary>
        /// 視頻分辨率的設置
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void resolutionCombox_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (resolutionCombox.Items.Count <= 0)
                return;

            videoCapability = videoSource1.VideoCapabilities[resolutionCombox.SelectedIndex];
        }


        /// <summary>
        /// 視頻源設置
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void VideoSourceSet_Click(object sender, RoutedEventArgs e)
        {
           
            try
            {
                videoSource1.DisplayPropertyPage(User1.getvideoSourcePlayer1.Handle);
                videoSource2.DisplayPropertyPage(User2.getvideoSourcePlayer2.Handle);
              //  videoSource1.DisplayCrossbarPropertyPage(User1.getvideoSourcePlayer1.Handle);
              //  videoSource2.DisplayCrossbarPropertyPage(User2.getvideoSourcePlayer2.Handle);
            }
            catch (Exception ex)
            {
                //視頻源必須按順序運行顯示橫樑屬性頁?
                MessageBox.Show(ex.ToString()+"  "+videoSource1.CheckIfCrossbarAvailable());

                Console.WriteLine(ex.ToString());
               
            }
        }
  
      
       
    }




////// 上面代碼太多,見諒,大家從裏面   選擇一些自己需要的功能,自己調試.

//這是拍照功能.

//這是錄像

 

以上就是這個攝像頭的操作,裏面可優化的空間很大,這個就是攝像頭涉及到的基本功能顯示,很原始。

 

對了,提一句:你可以對這個攝像頭採集到的圖像,使用AForge做各種圖像上的處理,比如高斯模糊,提取邊緣,什麼膨脹,腐蝕,提取交點啊等等(裏面對圖像的處理接口,我也已經寫好了哈,大夥兒直接處理那個bitmap就行了),反正opencv裏面可以做的,你在這裏都可以處理,  這樣就實現了我們視頻 上各種特效...我這裏只是提了個引子,之前這些圖像都處理過,一口氣寫了幾十個,有機會,給大家分享這些

 

 

如果大家優化了更好的,可以@我,我也學習一下.🙂

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章