【C#】#100 调用摄像头

需求:由于项目需要获得用户的头像,所以需要用C#调用摄像头获取头像。

下面写一个调用摄像头的方法

案例:调用摄像头的一个DEMO【效果图】

使用的类库:AForge.dll   【Demo下载,Demo里面有类库】

1、检测电脑上的摄像头设备

FilterInfoCollection videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);

 

用Count判断摄像头设备的个数,如果没有摄像头,则抛出异常【自行处理异常】,有摄像头,则添加到下拉框中

if (videoDevices.Count == 0)
           throw new ApplicationException();

 foreach (FilterInfo device in videoDevices)
 {
           tscbxCameras.Items.Add(device.Name);
 }

 

2、连接摄像头

检测到摄像头,就可以开始连接摄像头,获取图像啦。

//选择下拉框中的一个摄像头设备
 VideoCaptureDevice videoSource = new VideoCaptureDevice(videoDevices[tscbxCameras.SelectedIndex].MonikerString);
           
 //设置获取显示图像框的大小
 videoSource.DesiredFrameSize = new Size(320, 240);
 videoSource.DesiredFrameRate = 1;
            
 //为摄像头控件设置摄像头获取的图片
videPlayer.VideoSource = videoSource;
 //开启摄像头
videPlayer.Start();

 

3、关闭摄像头【也可以用 Stop() 方法关闭】

videPlayer.SignalToStop();
videPlayer.WaitForStop();

 

 

Demo运行截图:

image


项目中,多了一个截图:把摄像头上的图片绘制下来

 img = new Bitmap(102, 126, PixelFormat.Format24bppRgb); //设置图片的大小,位数
 videPlayer.DrawToBitmap((Bitmap)img, new Rectangle(0, 0, videPlayer.Width, videPlayer.Height));  //绘制图像到Img对象
 videPicture.Image = img;   
//显示到PictureBox控件上

 

在这里遇到过一个问题,那就是 GDI+一般性错误【原因:资源占用】

遇到问题的情况:

     1、修改人员信息的时候,先从本地读取图片文件,赋值到PictureBox上。

    2、保存的时候会再把PictureBox的图片保存到本地硬盘中。

解决办法: 解除图片资源占用即可】

1、把本地图片读取出来,深复制一份

2、把深复制的那一份赋值到PictureBox

3、关闭本地图片资源的关闭

#region 深复制图片,并且关闭资源,防止出现占用
 //图片的深复制,并且关闭占用图片文件的资源
 img = new Bitmap(path);
 Image bmp = new Bitmap(img.Width, img.Height);
 Graphics draw = Graphics.FromImage(bmp);
 draw.DrawImage(img, 0, 0);
 draw.Dispose();
 img.Dispose();
 videPicture.Image = bmp;
#endregion

项目中使用截图:

image

转载于:https://www.cnblogs.com/zhongxia/p/4248835.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C#语言中,可以通过使用Windows API调用摄像头。一种简单的方法是使用DirectShow,它是一个用于捕获音频和视频的API。以下是步骤: 1. 引入DirectShow库 使用Visual Studio创建一个新项目,在“解决方案资源管理器”窗口中右键单击项目名称,选择“属性”选项卡。在“VC++目录”下,选择“包含目录”,添加以下路径:$(WindowsSdkDir)\Include 在“链接器”下的“常规”选项卡中,选择“附加库目录”,添加以下路径:$(WindowsSdkDir)\Lib 在“链接器”下的“输入”选项卡中,选择“附加依赖项”,添加以下库:strmiids.lib vfw32.lib 2. 创建CaptureGraphBuilder 首先需要创建一个CaptureGraphBuilder对象。代码示例如下: ``` ICaptureGraphBuilder2 capGraph = (ICaptureGraphBuilder2) new CaptureGraphBuilder2(); int hr = capGraph.SetFiltergraph(graphBuilder); if (hr < 0) throw new Exception("Could not set filter graph"); ``` 3. 添加摄像头设备 使用DirectShow API,可以枚举系统中所有的视频输入设备。使用以下代码获取摄像头设备: ``` DsDevice[] devices = DsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice); if (devices.Length == 0) throw new Exception("No video input device detected"); ``` 其中,DsDevice是DirectShow设备的一个封装类。 4. 创建视频捕获滤镜 在DirectShow中,视频捕获设备被视为一个视频捕获滤镜。因此,需要创建一个视频捕获滤镜来捕获摄像头的视频流。代码示例如下: ``` IBaseFilter captureFilter = null; hr = graphBuilder.AddSourceFilterForMoniker(devices.Mon, null, "Video Capture", out captureFilter); if (hr < 0) throw new Exception("Could not add capture filter to graph"); ``` 其中,devices代表第一个摄像头设备。 5. 创建渲染滤镜 为了将视频显示在窗口上,需要创建一个渲染滤镜。代码示例如下: ``` IBaseFilter renderFilter = null; renderFilter = (IBaseFilter) new VideoRenderer(); hr = graphBuilder.AddFilter(renderFilter, "Video Renderer"); if (hr < 0) throw new Exception("Could not add render filter to graph"); ``` 6. 连接滤镜 将摄像头捕获滤镜和渲染滤镜连接起来,代码示例如下: ``` hr = capGraph.RenderStream(PinCategory.Preview, MediaType.Video, captureFilter, null, renderFilter); if (hr < 0) throw new Exception("Could not render video stream"); ``` 7. 显示视频窗口 最后,需要在窗口中显示视频流。可以使用Windows Forms控件或WPF控件来实现。代码示例如下: ``` Control videoWindow = (Control) IntPtr.Zero; hr = ((IVideoWindow) renderFilter).put_Owner(videoWindow.Handle); if (hr < 0) throw new Exception("Could not set owner window"); hr = ((IVideoWindow) renderFilter).put_WindowStyle(WindowStyle.Child | WindowStyle.ClipChildren); if (hr < 0) throw new Exception("Could not set window style"); hr = ((IVideoWindow) renderFilter).put_Visible(OABool.True); if (hr < 0) throw new Exception("Could not set video visible"); ``` 以上是一个简单的C#程序调用摄像头的步骤。如果您需要更详细的信息,请参考Microsoft MSDN文档或其他相关文献。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值