这是一篇国外的文章,介绍如何通过 WebRTC、OpenCV 和 WebSocket 技术实现在 Web 浏览器上的人脸识别,架构在 Jetty 之上。
实现的效果包括:
还能识别眼睛
人脸识别的核心代码:
页面:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <div>????<video id="live" width="320" height="240" autoplay style="display: inline;"></video>????<canvas width="320" id="canvas" height="240" style="display: inline;"></canvas></div>???<script type="text/javascript">????var video = $("#live").get()[0];????var canvas = $("#canvas");????var ctx = canvas.get()[0].getContext(‘2d‘);??????navigator.webkitGetUserMedia("video",????????????function(stream) {????????????????video.src = webkitURL.createObjectURL(stream);????????????},????????????function(err) {????????????????console.log("Unable to get video stream!")????????????}????)??????timer = setInterval(????????????function () {????????????????ctx.drawImage(video, 0, 0, 320, 240);????????????}, 250);</script> |
后台:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | public class FaceDetection {??????private static final String CASCADE_FILE = "resources/haarcascade_frontalface_alt.xml";??????private int minsize = 20;????private int group = 0;????private double scale = 1.1;??????/**?????* Based on FaceDetection example from JavaCV.?????*/????public byte[] convert(byte[] imageData) throws IOException {????????// create image from supplied bytearray????????IplImage originalImage = cvDecodeImage(cvMat(1, imageData.length,CV_8UC1, new BytePointer(imageData)));??????????// Convert to grayscale for recognition????????IplImage grayImage = IplImage.create(originalImage.width(), originalImage.height(), IPL_DEPTH_8U, 1);????????cvCvtColor(originalImage, grayImage, CV_BGR2GRAY);??????????// storage is needed to store information during detection????????CvMemStorage storage = CvMemStorage.create();??????????// Configuration to use in analysis????????CvHaarClassifierCascade cascade = new CvHaarClassifierCascade(cvLoad(CASCADE_FILE));??????????// We detect the faces.????????CvSeq faces = cvHaarDetectObjects(grayImage, cascade, storage, scale, group, minsize);??????????// We iterate over the discovered faces and draw yellow rectangles around them.????????for (int i = 0; i < faces.total(); i++) {????????????CvRect r = new CvRect(cvGetSeqElem(faces, i));????????????cvRectangle(originalImage, cvPoint(r.x(), r.y()),????????????????????cvPoint(r.x() + r.width(), r.y() + r.height()),????????????????????CvScalar.YELLOW, 1, CV_AA, 0);????????}??????????// convert the resulting image back to an array????????ByteArrayOutputStream bout = new ByteArrayOutputStream();????????BufferedImage imgb = originalImage.getBufferedImage();????????ImageIO.write(imgb, "png", bout);????????return bout.toByteArray();????}} |
详细的实现细节请阅读英文原文:
使用 HTML5, javascript, webrtc, websockets, Jetty 和 OpenCV 实现基于 Web 的人脸识别
原文:http://www.cnblogs.com/meetrice/p/4967783.html