C#笔记本相机的正常调用与相机参数调节(包含程序源码)

需要引用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)
        {

        }
    }
}

  • 7
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值