原文:在WPF中使用AForge.net控制摄像头拍照

利用AForge.net控制摄像头拍照最方便的方法就是利用PictureBox显示摄像头画面,但在WPF中不能直接使用PictureBox。必须通过<WindowsFormsHost></WindowsFormsHost>来提供交换功能。其解决方法如下:

1、按照常规方法新建一个WPF应用程序;

2、添加引用

WindowsFormsIntegration  (与WinForm交互的支持)

System.Windows.Forms (WinForm控件支持)

AForge.Video和AForge.Video.DirectShow(拷贝AForge.Video.dll,AForge.Video.DirectShow.dll,摄像头操作的库)

3、在XAML中添加  xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"(用wf代替System.Windows.Forms,即可使用<wf:PictureBox/>添加PictureBox控件

4、在界面相应位置添加

<WindowsFormsHost Name="winForm">

  <wf:PictureBox Name="myPicture"/>

</WindowsFormsHost>(至此,界面层的设置完成)

5、代码部分

首先在窗口加载时初始化摄像头

myPhoto = pictureHost.Child as System.Windows.Forms.PictureBox;
            FilterInfoCollection videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
            if (videoDevices.Count <= 0)
            {
                System.Windows.MessageBox.Show("请连接摄像头");
                return;
            }
            else
            {
                CloseCaptureDevice();
                myCaptureDevice = new VideoCaptureDevice(videoDevices[0].MonikerString);//myCaptureDevice的类型为VideoCaptureDevice,
                myCaptureDevice.NewFrame += new NewFrameEventHandler(myCaptureDevice_NewFrame);
                myCaptureDevice.DesiredFrameSize = new System.Drawing.Size(436, 360);//436, 360
                myCaptureDevice.DesiredFrameRate = 10;
                myCaptureDevice.Start();                
            }

PictureBox myPhoto = pictureHost.Child as System.Windows.Forms.PictureBox;//获取界面中的myPicture控件

void myCaptureDevice_NewFrame(object sender, NewFrameEventArgs eventArgs)//帧处理程序
        {
            Bitmap bitmap = (Bitmap)eventArgs.Frame.Clone();
            myPhoto.Image = bitmap.Clone(
                new RectangleF((bitmap.Size.Width - 295) / 2, (bitmap.Size.Height - 413) / 2, 295, 413), //显示图像的宽度为295像素,高度为413像素
                System.Drawing.Imaging.PixelFormat.Format32bppRgb);
        }

关闭摄像头,释放系统资源(在窗口推出时必须调用)

private void CloseCaptureDevice()
        {
            if (myCaptureDevice != null)
            {
                if (myCaptureDevice.IsRunning)
                {
                    myCaptureDevice.SignalToStop();                   
                }

       myCaptureDevice = null;
            }

    }

至此,使用AForge.net操作摄像头基本完成。摄像头捕获的画面能在PictureBox中显示出来,如果要实现拍照只需使用myCaptureDevice.Stop()停止摄像头,保存PictureBox中的Image属性即可。

原来想直接使用WPF中的Image控件显示摄像头,但在帧处理程序中始终提示无法操作帧图像,提示:没有权限操作,另一进程拥有该对象(大概是这个意思)。在这个问题上我纠结了大概有10天,一直都没有找到解决的办法,还请高人指点,谢谢!!

在WPF中使用AForge.net控制摄像头拍照的更多相关文章

  1. WPF中对三维模型的控制

    原文:WPF中对三维模型的控制 (以下选自南开大学出版社出版的<WPF和Silverlight教程>) 3Dmax中的建模模型可以导出为obj文件格式,将此文件导入WPF项目中,由WPF完 ...

  2. Android开发之控制摄像头拍照

    如今的手机一般都会提供相机功能,有些相机的镜头甚至支持1300万以上像素,有些甚至支持独立对焦.光学变焦这些仅仅有单反才有的功能,甚至有些手机直接宣传能够拍到星星.能够说手机已经变成了专业数码相机.为 ...

  3. 用Python控制摄像头拍照并发邮件

    概述前言 工具 思路 安装及导入包 设置参数 实现拍照 构造邮件内容 发送邮件 判断网络连接 开机自启 后记 o1 前言为什么会有写这个程序的想法呢? 最初的想法是写一个可以用电脑前置摄像头拍照的程序 ...

  4. 在WPF中使用AForge控件

    AForge.NET 是用C#写的一个关于计算机视觉和人工智能领域的框架,它包括图像处理.神经网络.遗传算法和机器学习等. 要实现视频功能,需要使用AForge.Controls命名空间中的Video ...

  5. WPF wpf中按钮操作权限控制

    权限控制我们有很多种方式可以实现. 这次项目中做个简单的权限控制,我们在所有按钮触发前判断,有权限则可执行. 我们自定义一个命令类. public class DelegateCommand : IC ...

  6. WPF中使用RenderTransformOrigin来控制动画的起点

    Render :渲染:Transform:动画:Origin:起点 RenderTransformOrigin:渲染动画的起点 取值为一个坐标的形式  取值范围: 0,0 到 1,1 0,0:表示左上 ...

  7. Android多媒体应用开发-控制摄像头拍照

    现在的手机的功能可谓是五花八门,手机照相功能就是特别突出的一点,现在的手机照相机甚至成了专业数码照相机,可以拍摄出清晰的照片和录制高分辨率的视频.Android操作系统呢,提供了相应的功能来控制拍照: ...

  8. C# 使用AForge调用笔记本摄像头拍照

    vs2012  winform 连接摄像头设备,这里需要引入 代码: using AForge; using AForge.Controls; using AForge.Imaging; using ...

  9. Python控制自己的手机摄像头拍照,并把照片自动发送到邮箱

    写在前面的一些P话: 今天这个案例,就是控制自己的摄像头拍照,并且把拍下来的照片,通过邮件发到自己的邮箱里.想完成今天的这个案例,只要记住一个重点:你需要一个摄像头 思路 通过opencv调用摄像头拍 ...

随机推荐

  1. samba服务器的搭建及使用

    一.Samba服务器的安装及配置 1.samba服务器的安装 rpm –ivh /mnt/Packages/samba-3. 5. 10-125. el6.i686.rpm 需要挂载红帽6的光盘 2. ...

  2. 百度搜索URL参数 搜索关键字

    http://www.baidu.com/s?wd=关键字 wd(Keyword):查询的关键词: http://www.baidu.com/s?wd=关键字&cl=3 cl(Class):搜 ...

  3. (转)Linux下apache限速和限制同一IP连接数的实现

    单位有一台DELL的服务器,4核双CPU,4G内存,1TB的存储空间,闲来无事,申请了域名http://www.zxzy123.cn,做了个网站,本以为用这样的配置做个下载站是绰绰有余了,没想到上线没 ...

  4. [原创作品]观察者模式在Web App的应用

    (转载请注明:http://zhutty.cnblogs.com, 交流请加群:164858883) 在软件工程中,有一条重要的原则就是:高内聚低耦合.这是评定软件的设计好坏的一个标准.所谓高内聚,指 ...

  5. HBase总结(十二)Java API 与HBase交互实例

    HBase提供了Java Api的訪问接口,掌握这个就跟Java应用使用RDBMS时须要JDBC一样重要 import java.io.IOException; import org.apache.h ...

  6. Bestcoder #47 B Senior&#39;s Gun

    Senior's Gun Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Tot ...

  7. GPG error [...] NO_PUBKEY [...]

    今天在Linux下遇到这个问题,发现很多资料都是英文的,为了方便出现同样错误的有英语阅读困难的人,整理解决方案如下: sudo apt-key adv --keyserver keyserver.ub ...

  8. Win32<CreatFile>

    CreateFile函数详解 CreateFile The CreateFile function creates or opens the following objects and returns ...

  9. 网页、JavaScript 数据类型

    JavaScript 数据类型 一.基本数据类型: 字符串.数字.布尔.日期和时间 JavaScript 拥有动态类型 JavaScript 拥有动态类型.这意味着相同的变量可用作不同的类型: 1 v ...

  10. Path对象

    Path是连续的Segment的集合,除了 Path 的第一个Segment和最后一个Segment外,其余的Segment的起始点都是前一个Segment的终止点,即Path对象的中的Segment ...