C#使用Aforge调用摄像头拍照
程序员文章站
2022-04-25 18:25:20
一、 新建一个Winform项目 二、使用Nuget添加引用 安装下图中红色框住的两个程序包 安装完后发现安装了如下图的程序包,这是因为上述两个程序包存在对其它程序包的依赖。 三、编写程序 1. 窗体设计,摄像头是下拉列表(cmbCamera,控件命名,下同),虽然示例只用到一个摄像头,但是该Dem ......
一、 新建一个winform项目
二、使用nuget添加引用
安装下图中红色框住的两个程序包
安装完后发现安装了如下图的程序包,这是因为上述两个程序包存在对其它程序包的依赖。
三、编写程序
1. 窗体设计,摄像头是下拉列表(cmbcamera,控件命名,下同),虽然示例只用到一个摄像头,但是该demo可用于多个摄像头间切换场景,分辨率是下拉列表(cmbresolution),列出摄像头所支持的分辨率,一个videosourceplayer控件(vispshoot),一个picturebox控件(picbpreview)。
2. 编写代码
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(); } } }
3. 测试
附上窗体设计代码:
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; } }
上一篇: Flutter 不一样的跨平台解决方案
下一篇: 总结python中pass的作用