在树莓派上可以使用它官方标配的摄像头,但是这个摄像头似乎不能被Windows IoT识别和使用。但是,可以在树莓派的USB口上插入任意型号的摄像头,就可以实现树莓派的拍摄功能。

关于摄像头的寻找和拍摄,我将其封装成一个类,如下:

  1. public class WebCamHelper
  2. {
  3. public MediaCapture mediaCapture;
  4.  
  5. private bool initialized = false;
  6.  
  7. /// <summary>
  8. /// 异步初始化网络摄像头
  9. /// </summary>
  10. public async Task InitializeCameraAsync()
  11. {
  12. if (mediaCapture == null)
  13. {
  14. // 尝试发现摄像头
  15. var cameraDevice = await FindCameraDevice();
  16.  
  17. if (cameraDevice == null)
  18. {
  19. // 没有发现摄像头
  20. Debug.WriteLine("No camera found!");
  21. initialized = false;
  22. return;
  23. }
  24.  
  25. // Creates MediaCapture initialization settings with foudnd webcam device
  26. var settings = new MediaCaptureInitializationSettings { VideoDeviceId = cameraDevice.Id };
  27.  
  28. mediaCapture = new MediaCapture();
  29. await mediaCapture.InitializeAsync(settings);
  30. initialized = true;
  31. }
  32. }
  33.  
  34. /// <summary>
  35. /// 异步寻找摄像头,如果没有找到,返回null,否则返回DeviceInfomation
  36. /// </summary>
  37. private static async Task<DeviceInformation> FindCameraDevice()
  38. {
  39. // Get available devices for capturing pictures
  40. var allVideoDevices = await DeviceInformation.FindAllAsync(DeviceClass.VideoCapture);
  41.  
  42. if (allVideoDevices.Count > )
  43. {
  44. // 如果发现,返回
  45. return allVideoDevices[];
  46. }
  47. else
  48. {
  49. return null;
  50. }
  51. }
  52.  
  53. /// <summary>
  54. /// 开启摄像头预览
  55. /// </summary>
  56. public async Task StartCameraPreview()
  57. {
  58. try
  59. {
  60. await mediaCapture.StartPreviewAsync();
  61. }
  62. catch
  63. {
  64. initialized = false;
  65. Debug.WriteLine("Failed to start camera preview stream");
  66. }
  67. }
  68.  
  69. /// <summary>
  70. /// 关闭摄像头预览
  71. /// </summary>
  72. public async Task StopCameraPreview()
  73. {
  74. try
  75. {
  76. await mediaCapture.StopPreviewAsync();
  77. }
  78. catch
  79. {
  80. Debug.WriteLine("Failed to stop camera preview stream");
  81. }
  82. }
  83.  
  84. /// <summary>
  85. /// 拍摄照片,返回StorageFile,文件将被存储到临时文件夹
  86. /// </summary>
  87. public async Task<StorageFile> CapturePhoto()
  88. {
  89. // Create storage file in local app storage
  90. string fileName = GenerateNewFileName() + ".jpg";
  91. CreationCollisionOption collisionOption = CreationCollisionOption.GenerateUniqueName;
  92. StorageFile file = await ApplicationData.Current.TemporaryFolder.CreateFileAsync(fileName, collisionOption);
  93.  
  94. // 拍摄并且存储
  95. await mediaCapture.CapturePhotoToStorageFileAsync(ImageEncodingProperties.CreateJpeg(), file);
  96.  
  97. //await Task.Delay(500);
  98.  
  99. return file;
  100. }
  101.  
  102. /// <summary>
  103. /// 产生文件名称
  104. /// </summary>
  105. private string GenerateNewFileName()
  106. {
  107. return " IoTSample" + DateTime.Now.ToString("yyyy.MMM.dd HH-mm-ss");
  108. }
  109.  
  110. public string GenerateUserNameFileName(string userName)
  111. {
  112. return userName + DateTime.Now.ToString("yyyy.MM.dd HH-mm-ss") + ".jpg";
  113. }
  114.  
  115. /// <summary>
  116. /// 如果摄像头初始化成功,返回true,否则返回false
  117. /// </summary>
  118. public bool IsInitialized()
  119. {
  120. return initialized;
  121. }

使用示例:

1.初始化

  1. private WebCamHelper camera;
  2. if(camera==null)
  3. {
  4. camera = new WebCamHelper();
  5. await camera.InitializeCameraAsync();
  6. }
  7. if(camera.IsInitialized())
  8. {
  9. tbMessage.Text = "Camera启动成功...";
  10. }
  11. else
  12. {
  13. tbMessage.Text = "Camera启动失败...";
  14. }

2.拍摄

  1. if (!camera.IsInitialized()) return;
  2. StorageFile imgFile = await camera.CapturePhoto();

拍摄完成的图片文件就存储在上面的imgFile中。

3.视频预览

如果想开启视频预览,实时查看摄像头捕获的图像,可以在XAML中先添加一个CaptureElement控件:

  1. <CaptureElement x:Name="cameraElement"
  2. Loaded="cameraElement_Loaded"/>

在CaptureElement的Loaded事件中执行source绑定:

  1. cameraElement.Source = camera.mediaCapture;

然后在想要开始视频预览的地方,执行:

  1. await camera.StartCameraPreview();

关闭视频预览:

  1. await camera.StopCameraPreview();

在Windows IoT上使用网络摄像头的更多相关文章

  1. 在Windows IoT上生成和识别二维码

    在Windows IoT生成和识别二维码,实际上由于是UWP上实现,所以,理论上,这些生成和识别二维码的方法也可以在其它平台上运行. 关于二维码的生成有很多库可以实现,比如QRCoder,这个库可以在 ...

  2. 【译】如何使用Vue捕获网络摄像头视频

    几个月前,我一直关注着比特币的爆发并且在GDAX网站上注册账号.在注册验证的过程中,网站提示要通过计算机的网络摄像头提交我自己的一张照片作为照片ID.这是一个很酷的做法,让我思考一个问题:在网络浏览器 ...

  3. 安天透过北美DDoS事件解读IoT设备安全——Mirai的主要感染对象是linux物联网设备,包括:路由器、网络摄像头、DVR设备,入侵主要通过telnet端口进行流行密码档暴力破解,或默认密码登陆,下载DDoS功能的bot,运行控制物联网设备

    安天透过北美DDoS事件解读IoT设备安全 安天安全研究与应急处理中心(安天CERT)在北京时间10月22日下午启动高等级分析流程,针对美国东海岸DNS服务商Dyn遭遇DDoS攻击事件进行了跟进分析. ...

  4. Android IOS WebRTC 音视频开发总结(八十三)-- 使用WebRTC广播网络摄像头视频(上)

    本文主要介绍WebRTC (我们翻译和整理的,译者:weizhenwei,校验:blacker),最早发表在[编风网] 支持原创,转载必须注明出处,欢迎关注我的微信公众号blacker(微信ID:bl ...

  5. 如何在Windows系统上用抓包软件Wireshark截获iPhone等网络通讯数据

    http://www.jb51.net/os/windows/189090.html 今天给大家介绍一种如何在Windows操作系统上使用著名的抓包工具软件Wireshark来截获iPhone.iPa ...

  6. 在Windows系统上怎么使用SecureCRT链接Linux AWS EC2 -摘自网络

    在Windows系统上就需要使用SecureCRT,Putty等工具,进行连接.但是AWS提供的XXX.pem文件,需要做一些处理SecureCRT的方法: 1.使用XXX.pem文件生成一个公钥文件 ...

  7. TVideoGrabber如何将网络摄像头影像实时发布到网络

    在TVideoGrabber中如何将网络摄像头影像实时发布到网络?如何设置正在运行TVideoGrabber的一台电脑,同时通过另一台电脑在网络中实时的观看在线视频呢? 在这里称发送视频流的电脑为“m ...

  8. 【安富莱原创开源应用第1期】花式玩转网络摄像头之TCP上位机软件实现,高端大气上档次,速度2MB/S,华丽丽的界面效果

    说明:1.例子是两年前做的,一直没有顾上整理出来,今天特地整理出来,开源出来给大家玩.2.上位机是emWin模拟器开发的,大家估计很难猜到,所以你会emWin话的,就可以轻松制作上位机.做些通信和控制 ...

  9. 《Windows IoT 应用开发指南》

    物物互联的时代已经到来,智能家居.智慧校园.智慧交通.可穿戴.无人机.全息投影,各种各样的新名词.黑科技层出不穷.当我们为五年前能够通过手机控制家电而欣喜若狂的时候,可曾憧憬过当前使用增强现实设备完成 ...

随机推荐

  1. Oracle数据库sqlplus与plsqldev解决乱码

    (出现乱码 解决方法留存) 问题描述 : 在用eclipse使用jdbc插入中文数据的时,数据用plsqldev查询时,正常显示中文,但是用sqlplus查询时,为中文乱码,当用plsqldev直接插 ...

  2. DDoS ATTACK PROCESSING APPARATUS AND METHOD IN OPENFLOW SWITCH

    An OpenFlow switch in an OpenFlow environment includes an attack determination module to collect sta ...

  3. DownLoadManager[20530:228829] DiskImageCache: Could not resolve the absolute path of the old directory.

    uiwebview 模拟器打开PDF文件时崩溃.报下面错误,还不知道为什么 DownLoadManager[20530:228829] DiskImageCache: Could not resolv ...

  4. 前端css实现最基本的时间轴

    原型: 图片.png 代码: <!DOCTYPE html > <html> <head> <link rel="stylesheet" ...

  5. 【poj2406】next数组求循环节

    传送门 题目分析 本题主要考察kmp中next数组在求循环时的运用: 字符串是循环的: len % (len - next[len]) == 0 字符串循环次数: len / (len - next[ ...

  6. spark action之saveastextfile

    java /** *saveastextfile 把rdd中的数据保存到文件中,只能指定文件夹 *@author Tele * */ public class SaveasTextFileDemo1 ...

  7. scala 中的修饰符

    package cn.scala_base.oop.scalaclass import scala.beans.BeanProperty; /** * scala中的field,类中定义的是方法,函数 ...

  8. WPF--常用布局介绍

    概述:本文简要介绍了WPF中布局常用控件及布局相关的属性 1 Canvas Canvas是一个类似于坐标系的面板,所有的元素通过设置坐标来决定其在坐标系中的位置..具体表现为使用Left.Top.Ri ...

  9. CUDA中block和thread的合理划分配置

    CUDA并行编程的基本思路是把一个很大的任务划分成N个简单重复的操作,创建N个线程分别执行执行,每个网格(Grid)可以最多创建65535个线程块,每个线程块(Block)一般最多可以创建512个并行 ...

  10. 如何提高自己的java开发功底

    1.拥有扎实的基础和深刻理解OO原则 对于Java程序员,深刻理解Object Oriented Programming(面向对象编程)这一概念是必须的.没有OOPS的坚实基础,就领会不了像Java这 ...