注:今天HTML5小组沙龙《论道HTML5》分享时有朋友问到一个问题,getUserMedia是否会支持人脸识别,我当时的答案是这应该是应用来实现的功能,而不是规范要完成的工作。而我之前在网上看到过一篇关于getUserMedia和人脸识别的相关文章,觉得很有趣,正好趁这个机会分享给大家。

译自:http://www.raymondcamden.com/index.cfm/2012/4/6/Face-detection-with-getUserMedia

转载请注明出处:蒋宇捷的博客

“现代Web”不断发展出不少有趣的API,但你并不会在大多数项目中使用到所有的内容。例如我一直特别关注Canvas特性。它对游戏和绘图意义重大 - 但是仅此而已。它并不是一个不好的特性,我只是不会经常用到它。每当看到一些开发中酷炫的新功能,我的大脑里都会思考它们可以产生哪些实际用途。显然对你有价值的内容可能对我来说并不一定,但搞清楚我如何实际使用一个功能是我学习它的一部分。

其中的一个特性是getUserMedia( W3C规范 )。它是一个JavaScript API,可以让你访问(需要权限)用户的网络摄像头和麦克风。 目前Opera和Chrome(我相信现在的版本18可以支持,但是你可能需要使用Canary。你还需要启用它。这儿有一个说明。)一旦你启用了getUserMedia,它使用起来相当简单。这里有一个快速的访问请求:

//a video tag var video = document.getElementById('monitor'); //request it navigator.webkitGetUserMedia('video', gotStream, noStream); function gotStream(stream) { video.src = webkitURL.createObjectURL(stream); video.onerror = function () { stream.stop(); streamError(); }; } function noStream() { document.getElementById('errorMessage').textContent = 'No camera available.'; } function streamError() { document.getElementById('errorMessage').textContent = 'Camera error.'; }

getUserMedia的第一个参数是类型。根据规范,这应该是一个对象,你可以启用音频、视频,或两者兼而有之,像这样:{audio:true, video:true}。然而在我的测试中,传递一个字符串“video”也可以正常工作。你将看到的演示基于另一个演示,所以代码来自于一个较早的Chrome下的版本。第二个和第三个参数是操作成功和失败的回调函数。

你可以看到操作成功的事件处理函数将视频流分配给HTML5 Video标签。最酷的是,一旦运行起来,你就可以使用Canvas API来拍照。对于这个演示,可以看看Greg Miernicki的Demo:

http://miernicki.com/cam.html

如果这个Demo无法工作,可以按照下面的说明来开启getUserMedia支持后再次进行尝试。(虽然我打算分享一些屏幕截图,所以如果你只是想继续阅读,那也没关系。)

基于Greg的Demo,我突然想到可以用网络摄像头的照片做一些很酷的东西。我记得Face.com有一个非常酷的API来解析脸部的图片。(我11月曾经在博客里写了一个ColdFusion的例子。)然后我在想,是否我们能把Greg的Demo与Face.com的API结合起来做一些基本面部识别的Demo。

这有这几个重大问题。 第一 - Face.com有一个很好的REST API,我们将如何从JavaScript应用程序里面来调用它?其次 - Face.com需要你可以上传图片,或给它一个网址。 我知道可以把一个Canvas图片发送给服务器,并通过我的后台上传到Face.com,但有没有办法绕过服务器来把图片发送给这个API?

第一个实际上并不是问题。Face.com实现了CORS(跨域资源共享)。CORS系统基本上可以让服务器暴露给其它域上文件的Ajax调用。这是一个伟大的功能,我希望更多的服务能够使用它。

更复杂的问题则是如何把画布上的数据发送到Face.com(宇捷注:还可以参考我的这篇文章《如何使用HTML5实现拍照上传应用》)。我如何模拟文件上传?这里有另一个很酷的新技巧 - Formdata。ColdFusion的研究员Sagar Ganatra关于这个话题有一篇很棒的博客。下面展示了我如何使用它:

function snapshot() { $("#result").html("<p><i>Working hard for the money...</i></p>"); canvas.width = video.videoWidth; canvas.height = video.videoHeight; canvas.getContext('2d').drawImage(video, 0, 0); var data = canvas.toDataURL('image/jpeg', 1.0); newblob = dataURItoBlob(data); var formdata = new FormData(); formdata.append("api_key", faceKey); formdata.append("api_secret", faceSecret); formdata.append("filename","temp.jpg"); formdata.append("file",newblob); $.ajax({ url: 'http://api.face.com/faces/detect.json?attributes=age_est,gender,mood,smiling,glasses', data: formdata, cache: false, contentType: false, processData: false, dataType:"json", type: 'POST', success: function (data) { handleResult(data.photos[0]); } }); }

让我们一行行来看这段代码。首先 - 我需要从画布对象获取二进制数据。有几种方法可以实现,但是我尤其想要一个二进制的Blob。请注意dataURIToBlob方法。这是几周前我从StockOverflow上发现的。

我创建了一个新的formdata对象,然后简单地设置了自己所需的值。你可以看到我为发起的API请求添加了几个参数,但关键在于文件名和文件对象本身。

接下来你可以看到简单的jQuery Ajax调用。Face.com有多种选择,但我基本只要求它返回预测年龄、性别、情绪,是否面带微笑以及戴着眼镜。就是这些。我得到了一个很棒的JSON包,并且对它进行了格式化。

现在显然API并不完美。我获得了使用API一些不同程度的结果。有时相当准确,有时相反。但是总体来说,这相当酷。这里有一些实际测试的图片,看起来有点“可怕”。

识别结果:neutral(无表情)

识别结果:happy(开心)

识别结果:surprised(惊讶)

识别结果:sad(悲伤)

好了,准备自己亲自来试试? 只需点击下面的演示按钮。如果需要源代码,可以直接在页面上查看! 这是100%的纯客户端代码。

如果想从另外一方面了解getUserMedia,可以看看这些例子:

  • 感谢getUserMedia(HTML5Doctor的这篇文章不错,可以了解到getUserMedia的前世今生,以及和HTML Media Capture API的区别。)
  • 在Chrome上测试WebRTC
  • HTML5新特性:WebRTC和设备访问
  • 用HTML5捕获音频和视频

用HTML5实现人脸识别相关推荐

  1. 网页实现人脸识别PHP,奇思妙想-用HTML5进行人脸识别

    今天发现一篇文章写的很有趣,叫你如何使用HTML5进行人脸识别.在网页内进行人脸识别,很好很强大! "现代Web"不断发展出不少有趣的API,但你并不会在大多数项目中使用到所有的内 ...

  2. 用HTML5实现人脸识别-用Javascript实现人脸美容

    在人脸识别的基础上,我们将使用纯Javascript来实现如下的功能: 识别和标注人脸以及五官 对人脸进行美容 从本文的内容中,你将意识到,Javascript能做的,能实现的,远远比你想象的多. 演 ...

  3. php活体检测,基于HTML5 的人脸识别活体认证的实现方法

    近几年,人脸识别技术在身份认证领域的应用已经有了较多应用,例如:支付宝.招行的取款.养老金领取等方面,但在杜绝假冒.认证安全性等方面,目前还是一个比较需要进一步解决的课题,特别是在移动端的活体认证技术 ...

  4. html clm标记,基于HTML5的人脸识别活体认证的实现方法

    近几年,人脸识别技术在身份认证领域的应用已经有了很多应用,例如:支付宝,招行的取款,养老金领取等方面,但在杜绝假冒,认证安全性等方面,目前还是一个比较需要进一步解决的课题,特别是在移动端的活体认证技术 ...

  5. 基于HTML5 的人脸识别活体认证

    近几年,人脸识别技术在身份认证领域的应用已经有了较多应用,例如:支付宝.招行的取款.养老金领取等方面,但在杜绝假冒.认证安全性等方面,目前还是一个比较需要进一步解决的课题,特别是在移动端的活体认证技术 ...

  6. 基于HTML5 的人脸识别技术

    为什么80%的码农都做不了架构师?>>>    通过 HTML5 + JavaScript 技术实现的人脸识别,目前仅适用于 Chrome 浏览器,首先需要在地址栏输入 about: ...

  7. 自动识别人脸html5,基于HTML5的人脸识别技术

    绍一个网站,演示了通过HTML5 + JavaScript技术实现的人脸识别,目前仅适用于Chrome浏览器,首先需要在地址栏输入about:flags,然后找到"启用MediaStream ...

  8. css人脸识别的圆圈,基于HTML5 的人脸识别活体认证的实现方法

    html> #container { position : relative; } #canvas { position : absolute; left : 0; top : 0; } 你的浏 ...

  9. tree.js 酷炫的效果,人脸识别签到思路,html5 3D微信头像自动抽奖代码

    1.酷炫效果 1.1 网址: https://wow.techbrood.com/fiddle/43962 网址:https://wow.techbrood.com/fiddle/25678 1.2  ...

最新文章

  1. win7x64注册表显卡渲染速度_Geek3D GpuTest GUI(显卡测试软件)下载-Geek3D GpuTest GUI(显卡测试软件)免费版下载v0.7.0...
  2. 第三讲:WCF介绍(3)
  3. 使用 Linux 和 Hadoop 进行分布式计算
  4. sketchup 图片转模型_你应该知道的那些 Sketchup 实用快捷键和使用技巧!
  5. oracle日志表设计,数据库设计 – 数据库日志表结构
  6. Mac 键盘符号整理
  7. tail查看nohup.out文件内容
  8. 逆向工程mysql注释_PowerDesigner 15进行逆向工程生成数据库图表时,注释的comment的生成,解决PowerDesigner逆向工程没有列注释...
  9. python密码字典生成库_python生成密码字典的方法
  10. CMakeLists.txt 介绍
  11. 游戏编程和计算机编程一样吗,学数控编程和电脑编程区别是什么?
  12. ALT+回车键 是强制换行的快捷键
  13. 终止所有mysql进程_如何查找和终止MySQL进程
  14. python 单词拆音节_基于Trie树进行拆分字符串变成拼音音节(一):构建拼音音节模型...
  15. gif格式图片的解析
  16. 微信小程序的模板消息与小程序订阅消息
  17. [优雅代码]-调用java集合Map.computeIfAbsent()方法
  18. 设计模式中,MVC模式与MVT模式的区别
  19. android倒计时日历软件,Hurry - 一款颜值超高的日历+倒计时 APP - Android 应用 - 纪念日 - 【最美应用】...
  20. 中华数据库与运维安全大会全程解析

热门文章

  1. 软件测试用例质量不高?我教你如何编写高质量的测试用例!
  2. android+查看内存容量apk,如何检查 Android 应用的内存使用情况
  3. linux 系统自动挂起,linux 系统挂起
  4. google python代码规范_Python代码这样写才规范优雅! (二)
  5. c语言小游戏 贴吧,【图片】C语言小游戏~贪吃蛇【c语言吧】_百度贴吧
  6. 面向对象编程:包,继承,多态,抽象类,接口
  7. Java 中的接口有什么作用?为什么不直接用类?
  8. datetime类型怎么输入_数据库之mysql的基础类型
  9. 云服务器搭建虚拟主机教程,云服务器搭建虚拟主机教程
  10. Java教程:Java String字符串和整型int的相互转换