欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C#使用Aforge调用摄像头拍照

程序员文章站 2022-04-25 18:25:20
一、 新建一个Winform项目 二、使用Nuget添加引用 安装下图中红色框住的两个程序包 安装完后发现安装了如下图的程序包,这是因为上述两个程序包存在对其它程序包的依赖。 三、编写程序 1. 窗体设计,摄像头是下拉列表(cmbCamera,控件命名,下同),虽然示例只用到一个摄像头,但是该Dem ......

一、 新建一个winform项目

二、使用nuget添加引用

C#使用Aforge调用摄像头拍照

 

安装下图中红色框住的两个程序包

C#使用Aforge调用摄像头拍照

 

 安装完后发现安装了如下图的程序包,这是因为上述两个程序包存在对其它程序包的依赖。

C#使用Aforge调用摄像头拍照

 

 三、编写程序

       1. 窗体设计,摄像头是下拉列表(cmbcamera,控件命名,下同),虽然示例只用到一个摄像头,但是该demo可用于多个摄像头间切换场景,分辨率是下拉列表(cmbresolution),列出摄像头所支持的分辨率,一个videosourceplayer控件(vispshoot),一个picturebox控件(picbpreview)。

        C#使用Aforge调用摄像头拍照

      2. 编写代码

         

C#使用Aforge调用摄像头拍照
using system;
using system.collections.generic;
using system.componentmodel;
using system.data;
using system.drawing;
using system.linq;
using system.text;
using system.windows.forms;
using aforge.video.directshow;

namespace aforgedemo
{
    public partial class form1 : form
    {
        private filterinfocollection videodevices;
        private videocapturedevice videodevice;
        private videocapabilities[] videocapabilities;
        private videocapabilities[] snapshotcapabilities;
        public form1()
        {
            initializecomponent();
        }

        private void form1_load(object sender, eventargs e)
        {
            videodevices = new filterinfocollection(filtercategory.videoinputdevice);
            if (videodevices.count != 0)
            {
                foreach (filterinfo device in videodevices)
                {
                    cmbcamera.items.add(device.name);
                }
            }
            else
            {
                cmbcamera.items.add("没有找到摄像头");
            }

            cmbcamera.selectedindex = 0;
        }

        private void cmbcamera_selectedindexchanged(object sender, eventargs e)
        {
            if (videodevices.count != 0)
            {
                videodevice = new videocapturedevice(videodevices[cmbcamera.selectedindex].monikerstring);
                getdeviceresolution(videodevice);
            }
        }

        private void getdeviceresolution(videocapturedevice videocapturedevice)
        {
            cmbresolution.items.clear();
            videocapabilities = videocapturedevice.videocapabilities;
            foreach (videocapabilities capabilty in videocapabilities)
            {
                cmbresolution.items.add($"{capabilty.framesize.width} x {capabilty.framesize.height}");
            }
            cmbresolution.selectedindex = 0;
        }

        private void btnconnect_click(object sender, eventargs e)
        {
            if (videodevice != null)
            {
                if ((videocapabilities != null) && (videocapabilities.length != 0))
                {
                    videodevice.videoresolution = videocapabilities[cmbresolution.selectedindex];

                    vispshoot.videosource = videodevice;
                    vispshoot.start();
                    enablecontrolstatus(false);
                }
            }
        }

        private void enablecontrolstatus(bool status)
        {
            cmbcamera.enabled = status;
            cmbresolution.enabled = status;
            btnconnect.enabled = status;
            btnshoot.enabled = !status;
            btndisconnect.enabled = !status;
        }

        private void btndisconnect_click(object sender, eventargs e)
        {
            disconnect();
            enablecontrolstatus(true);
        }

        private void disconnect()
        {
            if (vispshoot.videosource != null)
            {
                vispshoot.signaltostop();
                vispshoot.waitforstop();
                vispshoot.videosource = null;
            }
        }

        private void btnshoot_click(object sender, eventargs e)
        {
            bitmap img = vispshoot.getcurrentvideoframe();
            picbpreview.image = img;
        }

        private void form1_formclosing(object sender, formclosingeventargs e)
        {
            disconnect();
        }
    }
}
view code

     3. 测试

        C#使用Aforge调用摄像头拍照

 附上窗体设计代码:

C#使用Aforge调用摄像头拍照
namespace aforgedemo
{
    partial class form1
    {
        /// <summary>
        /// 必需的设计器变量。
        /// </summary>
        private system.componentmodel.icontainer components = null;

        /// <summary>
        /// 清理所有正在使用的资源。
        /// </summary>
        /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
        protected override void dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.dispose();
            }
            base.dispose(disposing);
        }

        #region windows 窗体设计器生成的代码

        /// <summary>
        /// 设计器支持所需的方法 - 不要修改
        /// 使用代码编辑器修改此方法的内容。
        /// </summary>
        private void initializecomponent()
        {
            this.label1 = new system.windows.forms.label();
            this.cmbcamera = new system.windows.forms.combobox();
            this.label2 = new system.windows.forms.label();
            this.cmbresolution = new system.windows.forms.combobox();
            this.vispshoot = new aforge.controls.videosourceplayer();
            this.picbpreview = new system.windows.forms.picturebox();
            this.btnconnect = new system.windows.forms.button();
            this.btndisconnect = new system.windows.forms.button();
            this.btnshoot = new system.windows.forms.button();
            ((system.componentmodel.isupportinitialize)(this.picbpreview)).begininit();
            this.suspendlayout();
            // 
            // label1
            // 
            this.label1.autosize = true;
            this.label1.location = new system.drawing.point(39, 22);
            this.label1.name = "label1";
            this.label1.size = new system.drawing.size(53, 12);
            this.label1.tabindex = 0;
            this.label1.text = "摄像头:";
            // 
            // cmbcamera
            // 
            this.cmbcamera.formattingenabled = true;
            this.cmbcamera.location = new system.drawing.point(98, 19);
            this.cmbcamera.name = "cmbcamera";
            this.cmbcamera.size = new system.drawing.size(113, 20);
            this.cmbcamera.tabindex = 1;
            this.cmbcamera.selectedindexchanged += new system.eventhandler(this.cmbcamera_selectedindexchanged);
            // 
            // label2
            // 
            this.label2.autosize = true;
            this.label2.location = new system.drawing.point(217, 22);
            this.label2.name = "label2";
            this.label2.size = new system.drawing.size(53, 12);
            this.label2.tabindex = 0;
            this.label2.text = "分辨率:";
            // 
            // cmbresolution
            // 
            this.cmbresolution.formattingenabled = true;
            this.cmbresolution.location = new system.drawing.point(276, 19);
            this.cmbresolution.name = "cmbresolution";
            this.cmbresolution.size = new system.drawing.size(88, 20);
            this.cmbresolution.tabindex = 1;
            // 
            // vispshoot
            // 
            this.vispshoot.location = new system.drawing.point(41, 54);
            this.vispshoot.name = "vispshoot";
            this.vispshoot.size = new system.drawing.size(591, 332);
            this.vispshoot.tabindex = 2;
            this.vispshoot.text = "videosourceplayer1";
            this.vispshoot.videosource = null;
            // 
            // picbpreview
            // 
            this.picbpreview.location = new system.drawing.point(41, 423);
            this.picbpreview.name = "picbpreview";
            this.picbpreview.size = new system.drawing.size(180, 175);
            this.picbpreview.sizemode = system.windows.forms.pictureboxsizemode.zoom;
            this.picbpreview.tabindex = 3;
            this.picbpreview.tabstop = false;
            // 
            // btnconnect
            // 
            this.btnconnect.location = new system.drawing.point(382, 19);
            this.btnconnect.name = "btnconnect";
            this.btnconnect.size = new system.drawing.size(80, 23);
            this.btnconnect.tabindex = 4;
            this.btnconnect.text = "连接";
            this.btnconnect.usevisualstylebackcolor = true;
            this.btnconnect.click += new system.eventhandler(this.btnconnect_click);
            // 
            // btndisconnect
            // 
            this.btndisconnect.enabled = false;
            this.btndisconnect.location = new system.drawing.point(468, 19);
            this.btndisconnect.name = "btndisconnect";
            this.btndisconnect.size = new system.drawing.size(80, 23);
            this.btndisconnect.tabindex = 4;
            this.btndisconnect.text = "断开";
            this.btndisconnect.usevisualstylebackcolor = true;
            this.btndisconnect.click += new system.eventhandler(this.btndisconnect_click);
            // 
            // btnshoot
            // 
            this.btnshoot.enabled = false;
            this.btnshoot.location = new system.drawing.point(552, 19);
            this.btnshoot.name = "btnshoot";
            this.btnshoot.size = new system.drawing.size(80, 23);
            this.btnshoot.tabindex = 4;
            this.btnshoot.text = "拍照";
            this.btnshoot.usevisualstylebackcolor = true;
            this.btnshoot.click += new system.eventhandler(this.btnshoot_click);
            // 
            // form1
            // 
            this.autoscaledimensions = new system.drawing.sizef(6f, 12f);
            this.autoscalemode = system.windows.forms.autoscalemode.font;
            this.clientsize = new system.drawing.size(677, 610);
            this.controls.add(this.btnshoot);
            this.controls.add(this.btndisconnect);
            this.controls.add(this.btnconnect);
            this.controls.add(this.picbpreview);
            this.controls.add(this.vispshoot);
            this.controls.add(this.cmbresolution);
            this.controls.add(this.cmbcamera);
            this.controls.add(this.label2);
            this.controls.add(this.label1);
            this.name = "form1";
            this.text = "form1";
            this.formclosing += new system.windows.forms.formclosingeventhandler(this.form1_formclosing);
            this.load += new system.eventhandler(this.form1_load);
            ((system.componentmodel.isupportinitialize)(this.picbpreview)).endinit();
            this.resumelayout(false);
            this.performlayout();

        }

        #endregion

        private system.windows.forms.label label1;
        private system.windows.forms.combobox cmbcamera;
        private system.windows.forms.label label2;
        private system.windows.forms.combobox cmbresolution;
        private aforge.controls.videosourceplayer vispshoot;
        private system.windows.forms.picturebox picbpreview;
        private system.windows.forms.button btnconnect;
        private system.windows.forms.button btndisconnect;
        private system.windows.forms.button btnshoot;
    }
}
view code