需要引用AForge库文件,需要提前安装。在引用里面管理Nuget程序包;
先设计UI页面,设置好控件:
以下是程序Dome: (小白写的比较繁琐,大神勿喷)
using System.Windows.Forms;
using AForge.Video.DirectShow;
using System.IO;
using System.IO.IsolatedStorage;
using System.Threading;
namespace 相机的调用与拍照
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public FilterInfoCollection videoDevices;//所有摄像设备
public VideoCaptureDevice videoDevice;//摄像设备
string filePath = System.AppDomain.CurrentDomain.BaseDirectory + "Picture";
private VideoCapabilities[] videoCapabilities;//摄像头分辨率
private void Form1_Load(object sender, EventArgs e)
{
if (!Directory.Exists(filePath)) Directory.CreateDirectory(filePath);
videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);//得到机器所有接入的摄像设备
if (videoDevices.Count != 0)//读取到摄像设备
{
foreach (FilterInfo device in videoDevices)
{
com1_cam1.Items.Add(device.Name);//把摄像设备添加到摄像列表中
}
com1_cam1.SelectedIndex = 0;//默认选择第一个
//获取摄像头
videoDevice = new VideoCaptureDevice(videoDevices[com1_cam1.SelectedIndex].MonikerString);
GetDeviceResolution(videoDevice);//获得摄像头的分辨率
}
else
{
com1_cam1.Items.Add("没有找到摄像头");
}
EnableControlStatus(false);
btn_cat.Enabled = false;
}
private void 相机设置ToolStripMenuItem_Click(object sender, EventArgs e)
{
VideoCaptureDevice Cam1;
FilterInfoCollection VideoCaptureDevices;
VideoCaptureDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
Cam1 = new VideoCaptureDevice(VideoCaptureDevices[com1_cam1.SelectedIndex].MonikerString);
Cam1.DisplayPropertyPage(IntPtr.Zero); //这将显示带有摄像头控件的窗体
}
private void btn_break_Click(object sender, EventArgs e)
{
DisConnect();//断开连接
EnableControlStatus(false);
}
public void DisConnect() //关闭断开相机
{
if (!string.IsNullOrEmpty((video_cma1.VideoSource).ToString())) //不为null或空 就进入条件
{
video_cma1.SignalToStop();
video_cma1.WaitForStop();
video_cma1.VideoSource = null;
video_cma2.SignalToStop();
video_cma2.WaitForStop();
video_cma2.VideoSource = null;
}
}
private void EnableControlStatus(bool status)
{
btn_photograph.Enabled = status;//运行时接收到前面传过来的bool值 决定是否启用
btn_break.Enabled = status;
相机设置ToolStripMenuItem.Enabled = status;
辅助ToolStripMenuItem.Enabled=status;
}
private void btn_connect_Click(object sender, EventArgs e)
{
//清除控件内 相机内容
video_cma1.SignalToStop();
video_cma1.WaitForStop();
video_cma1.VideoSource = null;
video_cma2.SignalToStop();
video_cma2.WaitForStop();
video_cma2.VideoSource = null;
int cam;
if (videoDevices.Count != 0)//读取到摄像设备
{
//获取摄像头
videoDevice = new VideoCaptureDevice(videoDevices[com1_cam1.SelectedIndex].MonikerString);
videoDevice.VideoResolution = videoCapabilities[cboResolution.SelectedIndex];//摄像头分辨率
video_cma1.VideoSource = videoDevice;
cam = com1_cam1.SelectedIndex;
video_cma1.Start();
if (com1_cam1.Items.Count >= 2)
{
if (cam == 0)
{
videoDevice = new VideoCaptureDevice(videoDevices[1].MonikerString);
videoDevice.VideoResolution = videoCapabilities[1];//摄像头分辨率
video_cma2.VideoSource = videoDevice;
video_cma2.Start();
}
else if (cam == 1)
{
video_cma2.SignalToStop();
video_cma2.WaitForStop();
video_cma2.VideoSource = null;
videoDevice = new VideoCaptureDevice(videoDevices[0].MonikerString);
videoDevice.VideoResolution = videoCapabilities[0];//摄像头分辨率
video_cma2.VideoSource = videoDevice;
video_cma2.Start();
}
}
else
{
videoDevice = new VideoCaptureDevice(videoDevices[0].MonikerString);
videoDevice.VideoResolution = videoCapabilities[0];//摄像头分辨率
video_cma1.VideoSource = videoDevice;
video_cma1.Start();
video_cma2.VideoSource = videoDevice;
video_cma2.Start();
}
EnableControlStatus(true);//调用一个方法,运行到这时 调用下列的方法,把bool值传过去。
}
else
{
MessageBox.Show("请检查相机连接情况", "提醒", MessageBoxButtons.OK, MessageBoxIcon.Stop);
}
}
int i = 0;
private void btn_photograph_Click(object sender, EventArgs e)
{
while (true)
{
i++;
//创建图像对象
Bitmap img = video_cma1.GetCurrentVideoFrame();//CAM1拍照
Bitmap img2=video_cma2.GetCurrentVideoFrame();//CAM2拍照
// picbPreview.Image = img;
Thread.Sleep(1000);
// picbPreview.Update();
//这里可以根据情况,把照片存到某个路径下
string filename, filename1;
if ((fname.Text != null) && (fname.Text != ""))
{
//创建图片
filename = fname.Text;
filename1= fname.Text;
}
else
{
//创建图片
filename = $"相机1_{i}";
filename1 = $"相机2_{i}";
}
img.Save($"{filePath}/{filename}.jpg");
img2.Save($"{filePath}/{filename1}.jpg");
Picture_form2.picture2 = ($"{filePath}/{filename}.jpg");
break;
}
btn_cat.Enabled = true;
}
//获得摄像头的分辨率
private void GetDeviceResolution(VideoCaptureDevice videoCaptureDevice)
{
cboResolution.Items.Clear();//清空列表
videoCapabilities = videoCaptureDevice.VideoCapabilities;//设备的摄像头分辨率数组
foreach (VideoCapabilities capabilty in videoCapabilities)
{
//把这个设备的所有分辨率添加到列表
cboResolution.Items.Add($"{capabilty.FrameSize.Width} x {capabilty.FrameSize.Height}");
}
cboResolution.SelectedIndex = 0;//默认选择第一个
}
private void btn_file_Click(object sender, EventArgs e)
{
System.Diagnostics.Process.Start(filePath);//打开照片文件夹
}
private void button1_Click(object sender, EventArgs e)
{
Picture_form2 form2= new Picture_form2();
form2.ShowDialog();
}
private void com1_cam1_Click(object sender, EventArgs e)
{
videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);//得到机器所有接入的摄像设备
com1_cam1.Items.Clear();
if (videoDevices.Count != 0)//读取到摄像设备
{
foreach (FilterInfo device in videoDevices)
{
com1_cam1.Items.Add(device.Name);//把摄像设备添加到摄像列表中
}
com1_cam1.SelectedIndex = 0;//默认选择第一个
//获取摄像头
videoDevice = new VideoCaptureDevice(videoDevices[com1_cam1.SelectedIndex].MonikerString);
GetDeviceResolution(videoDevice);//获得摄像头的分辨率
}
else
{
com1_cam1.Items.Add("没有找到摄像头");
}
}
private void 辅助ToolStripMenuItem_Click(object sender, EventArgs e)
{
VideoCaptureDevice Cam1;
FilterInfoCollection VideoCaptureDevices;
VideoCaptureDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
if (com1_cam1.Items.Count >= 2)
{
Cam1 = new VideoCaptureDevice(VideoCaptureDevices[1].MonikerString);
Cam1.DisplayPropertyPage(IntPtr.Zero); //这将显示带有摄像头控件的窗体
}
if (com1_cam1.Items.Count <= 1) ;MessageBox.Show("没有辅相机请勿点击!","提醒",MessageBoxButtons.OK,MessageBoxIcon.Exclamation);
}
private void 退出ToolStripMenuItem_Click(object sender, EventArgs e)
{
video_cma1.SignalToStop();
video_cma1.WaitForStop();
video_cma1.VideoSource = null;
video_cma2.SignalToStop();
video_cma2.WaitForStop();
video_cma2.VideoSource = null;
Close();
}
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
}
}
}