C#操作摄像头实现拍照监控录像功能

   从正式工作以来一直做的都是基于B/S的Web开发,已经很长时间不研究C/S的东西了,但是受朋友的委托,帮他做一下拍照的这么个小功能。其实类似的代码网上有很多,但是真的能够拿来运行的估计也没几个。本来是说周末给做的,但是这两天脑子一直很乱,也没静下来,晚上了,再不做明天有点不好意思啊,只能临时做一个了。在网上找资料自己做的过程中也发现了一些问题,于是拿到博客上来分享一下,这样一来有需要的朋友可以直接拿来用,二来正在研究的遇到这些问题了可以迎刃而解。

  刚开始接触摄像头视频之类的是在大二的时候,那时候因为实验室有一个小项目交到我手上,所以那时候对播放视频之类的了解了一些。那时候的需求是对已经录下来的监控录像做处理,整个过程是已经不需要自己再去控制录像了,所以相对简单一点。而拍照和摄像是自己控制,所以稍微复杂那么一点点。行了,废话说到这里,下面进入正题。

  还是以往的作风,只实现功能,对界面不做过多的美化,有需要的朋友可以自己动手。比较这年头自己动手,丰衣足食嘛。图1-1是程序的主界面:


  图1-1

  操作摄像头以及实现拍照功能整个过程主要都是通过一个第三方的组件实现的,名字叫做 AForge ,是国外的组件,所以打开起来有点慢,但是要有耐心啊,目前已经更新到2.2.5版本了。如果不愿意从官网上下载,文章末尾处也给出了相应的下载地址,需要的话直接拿来用就ok了。程序也很简单,一个WinForm页面,添加一下对Aforge的引用就可以了,但是这个过程中会引用一些其他的dll,有些不是太常用,所以在这里对引用的dll也做了截图(图1-2),在自己做的过程中参照一下即可。


  图1-2

  上图1-1中间部分是用来实时显示摄像头开启后获取到的内容,是一个自定义控件。这里得说明一下,将AForge.Controls.dll拖拽到左侧的工具箱区域,然后就出来自定义控件了。这里顺便说明一下,我们平时自己开发的自定义控件也可以通过这种方式来给别人用。前台都准备好了之后我们来开始分析后台代码。

  整个的思路是先找到电脑上的摄像头设备,然后选择我们需要操作的设备,然后在拍照或者摄像。今天由于时间关系仅仅只是实现拍照,下次再做摄像的功能,实现之后也会一样分享在这里的,希望有需要的朋友关注。

  当Form加载的时候,我们监听一下其Load事件,将检测到的摄像头设备添加到后边的ComboBox中供用户选择,关键代码如下:

  Private void Form1_Load(object sender, EventArgs e)

  {

  try

  {

  // 枚举所有视频输入设备

  videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);

  if (videoDevices.Count == 0)

  throw new ApplicationException();

  foreach (FilterInfo device in videoDevices)

  {

  tscbxCameras.Items.Add(device.Name);

  }

  tscbxCameras.SelectedIndex = 0;

  }

  catch (ApplicationException)

  {

  tscbxCameras.Items.Add("No local capture devices");

  videoDevices = null;

  }

  }

  当用户选择某一摄像头设备再点击连接的时候,我们打开摄像头,并对其进行初始化,关键代码:

  //连接摄像头

  private void CameraConn()

  {

  VideoCaptureDevice videoSource = new VideoCaptureDevice(videoDevices[tscbxCameras.SelectedIndex].MonikerString);

  videoSource.DesiredFrameSize = new System.Drawing.Size(320, 240);

  videoSource.DesiredFrameRate = 1;

  videoSourcePlayer.VideoSource = videoSource;

  videoSourcePlayer.Start();

  }

  当用户关闭点击关闭摄像头的时候,我们做关闭的处理,代码:

  //关闭摄像头

  private void btnClose_Click(object sender, EventArgs e)

  {

  videoSourcePlayer.SignalToStop();

  videoSourcePlayer.WaitForStop();

  }

  当用户点击拍照的时候,我们获取摄像头当前的画面,并保存到设定的路径下,然后关闭当前窗口。关键代码:

  //拍照

  private void Photograph_Click(object sender, EventArgs e)

  {

  try

  {

  if (videoSourcePlayer.IsRunning)

  {

  BitmapSource bitmapSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(

  videoSourcePlayer.GetCurrentVideoFrame().GetHbitmap(),

  IntPtr.Zero,

  Int32Rect.Empty,

  BitmapSizeOptions.FromEmptyOptions());

  PngBitmapEncoder pE = new PngBitmapEncoder();

  pE.Frames.Add(BitmapFrame.Create(bitmapSource));

  string picName = GetImagePath() + "" + "xiaosy" + ".jpg";

  if (File.Exists(picName))

  {

  File.Delete(picName);

  }

  using (Stream stream = File.Create(picName))

  {

  pE.Save(stream);

  }

  //拍照完成后关摄像头并刷新同时关窗体

  if (videoSourcePlayer != null && videoSourcePlayer.IsRunning)

  {

  videoSourcePlayer.SignalToStop();

  videoSourcePlayer.WaitForStop();

  }

  this.Close();

  }

  }

  catch (Exception ex)

  {

  MessageBox.Show("摄像头异常:" + ex.Message);

  }

  }

  private string GetImagePath()

  {

  string personImgPath = Path.GetDirectoryName(AppDomain.CurrentDomain.BaseDirectory)

  + Path.DirectorySeparatorChar.ToString() + "PersonImg";

  if (!Directory.Exists(personImgPath))

  {

  Directory.CreateDirectory(personImgPath);

  }

  return personImgPath;

  }

  关闭之后,在bin目录下的PersonImg中即可找到保存的图片,当然,在程序中把该图片展示出来效果会更好,但是由于时间关系,就不添加了。需要的朋友可以自己实现,有问题的欢迎一起交流。

时间: 2025-01-19 14:36:03

C#操作摄像头实现拍照监控录像功能的相关文章

Silverlight 4 Beta之操作摄像头/麦克风

Silverlight4Beta带来了万众期待的新特性:对摄像头/麦克风的支持. 本篇文章将通过一个操作摄像头的实例来演示这个新特性,我们的实例主要实现以下功能 显示设备名 开始/停止捕获视频 实时截取图像 由于麦克风的使用和摄像头大同小异,并且也无法直观的表现所以在这里就不赘述了. 老规矩,我们先造个简单UI出来,XAML如下 <UserControl.Resources> <Style TargetType="TextBlock"> <Setter P

c#如何操作摄像头生成实时图片

问题描述 c#如何操作摄像头生成实时图片??请高手解答!!!! 解决方案 解决方案二:哎,很多控件,隨便拿來用就好了解决方案三:直接调用接口dll的函数就可以了,文档上各个参数都有说明.比如6.1抓BMP图BOOLBMPCapturePicture(LPCTSTRlpSavePath,BOOLbShowSaveFile)功能:抓BMP图,在预览时才有效参数说明:lpSavePath:设置保存图片的路径.默认为"C:OCXBMPCaptureFiles",图片保存在写入路径的BMPCap

html5调用摄像头实现拍照

技术时刻都在前进着.我们的需求也是时刻在改变着.最近在开发中遇到了用户进行账号注册时需要个人图像,网站提供自动拍照功能.还有在登录了PC之后,手机端进行登录时只需要扫描一下PC上的二维码就可以登录.这对一个网络来说难度是极大的. 技术的进步使我们遇到了html5.下面这个简单粗暴的demo就是来完成这些功能的.直接看代码: <!DOCTYPE html> <html> <head> <title>html5调用摄像头实现拍照</title> &l

远程摄像头自动拍照并存储

问题描述 远程摄像头自动拍照并存储 怎么让多个摄像头在规定的时间内自动拍照并以规定的时间为文件名 存储 解决方案 http://download.csdn.net/detail/zdl8936/3533782 解决方案二: 不是我想要的那种,能不能介绍个编程人员,能够控制摄像头的程序

安卓 监听器-安卓调用摄像头功能拍照函数

问题描述 安卓调用摄像头功能拍照函数 其中有一句拍照键public boolean函数用的是两个我手机没有的按钮,拍不了,只能设置音量键...我又用了一个onclick函数想用button来拍,可是由于程序里有个dIalogonclick监听,普通的监听就报错了,新手已不知道怎么办,求指教,去网上搜了不少程序,基本都是用这个函数我也不知道怎么改 解决方案 Android 调用摄像头功能[拍照] 解决方案二: 这图怎么这样了,我去.. 解决方案三: 自顶自顶自顶自顶自顶

求助java如果要调用摄像头用拍照要怎样去写

问题描述 求助java如果要调用摄像头用拍照要怎样去写 1C 具体内容是这样的,如果我要写一个三连拍保存照片的程序应该怎么写,可能的换能不能加上三张照片比对大小的功能,不行的话就不用了...因为不知道怎么去找出虚拟摄像头禁止掉才想用上面这个方法,我想确定拍照的摄像头是不是虚拟摄像头,然后去阻止这个虚拟摄像头拍照,但是不知道该怎么做...先谢各位了...

python操作摄像头截图实现远程监控的例子_python

最近用python写了一个远程监控的程序,主要功能有:1.用邮件控制所以功能2.可以对屏幕截图,屏幕截图发送到邮箱3.可以用摄像头获取图片,这些图片上传到七牛4.开机自启动 复制代码 代码如下: ##coding by loster#import win32apiimport win32conimport platformimport socketimport timeimport osimport smtplibimport poplibfrom VideoCapture import Dev

赵忠祥私人会所内景曝光摄像头24小时监控

赵忠祥私人会所内景(1 /7张) 四川在线-华西都市报5月25日报道 故宫的建福宫被改造成了一个全球顶级富豪们独享的顶级会所,引发极大争议.其实在北京有很多会所,今年已69岁的赵忠祥,就在北京创办了一个私人"文化会所".但赵忠祥的私人"文化会所",到底是什么样子?昨天(5月24日)上午,华西都市报记者应赵忠祥邀请,来到他神秘的私人会所采访.中午时分,赵忠祥的老搭档倪萍前来做客.赵忠祥十分高兴,亲自下厨,为倪萍烹制北京炸酱面. 四层小楼共1200平方米 很文化 昨天上

怎样操作电脑进行隐蔽的远程监控 

互联网让世界真正开放起来;而免费的网络人远程监控软件在远程监控领域的脱颖而出,无疑是锦上添花之举.使用远程监控软件,你可以轻松享受远程办公生活的高效.便捷,以及即时远程监控带来的前所未有的安全感. 网络人远程控制软件监控版(免费下载地址:http://netman123.cn/download.asp),会员登录后再连接,被控制的远程电脑无任何提示,对方不会发觉.适用范围广,可用于远程监控.远程办公.远程教育.远程维护.远程协助等领域.无论在家还是在旅途中,只要运行远程监控软件,就能够隐蔽.安全