先上圖,這是整個功能的界面: (這裏就連了兩個相機,如果想連接上百個,這裏提一句超級優化的方向,大家可以使用雙緩衝概念(是不是很懵?),其實說白了,就是多幅位圖繪製到一張位圖上顯示. 以前也是做實時繪製的時候,不知不覺就使用這種方式,直到後來,才聽到 雙緩衝 這個看似“高大上的”概念,真是倒騰概念.🙂)
首先聲明,裏面應該使用線程的方式,大家記得重新封裝,代替裏面的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裏面可以做的,你在這裏都可以處理, 這樣就實現了我們視頻 上各種特效...我這裏只是提了個引子,之前這些圖像都處理過,一口氣寫了幾十個,有機會,給大家分享這些
如果大家優化了更好的,可以@我,我也學習一下.🙂