 5db9a3f32a
			
		
	
	5db9a3f32a
	
	
	
		
			
			Updated a few demos to work on Firefox. R=dutton@google.com Review URL: https://webrtc-codereview.appspot.com/1581006 git-svn-id: http://webrtc.googlecode.com/svn/trunk@5464 4adac7df-926f-26a2-2b94-8c16560cd09d
		
			
				
	
	
		
			149 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			149 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
| <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 | |
| <html>
 | |
| <head>
 | |
| <script type="text/javascript" src="../js/ccv.js"></script>
 | |
| <script type="text/javascript" src="../js/face.js"></script>
 | |
| <!-- Load the polyfill to switch-hit between Chrome and Firefox -->
 | |
| <script src="../../base/adapter.js"></script>
 | |
|   <style type="text/css">
 | |
| * { margin:0; padding:0; } /* to remove the top and left whitespace */
 | |
| html, body { width:100%; height:100%; } /* just to be sure these are full screen*/
 | |
| body {font-family: 'Helvetica';background-color: #000000; }
 | |
| a:link { color: #ffffff; } a:visited {color: #ffffff; }
 | |
| 
 | |
| #localCanvas {
 | |
|     display: block;
 | |
|     position: absolute;
 | |
|     width: 100%;
 | |
|     height: 100%;
 | |
| }
 | |
| 
 | |
| #localVideo {
 | |
|     display: block;
 | |
|     position: absolute;
 | |
|     top: 0;
 | |
|     bottom: 0;
 | |
|     left: 0;
 | |
|     right: 0;
 | |
|     width: 100%;
 | |
|     height: 100%;
 | |
|     -webkit-transition-property: opacity;
 | |
|     -webkit-transition-duration: 2s;
 | |
|     opacity: 0;
 | |
| }
 | |
| #logo {
 | |
|     display: block;
 | |
|     top:4;
 | |
|     right:4;
 | |
|     position:absolute;
 | |
|     float:right;
 | |
|     #opacity: 0.8;
 | |
| }
 | |
| 
 | |
| #credit {
 | |
|     display: block;
 | |
|     top:28;
 | |
|     right:4;
 | |
|     position:absolute;
 | |
|     float:right;
 | |
|     font-size:10px;
 | |
| }
 | |
| 
 | |
|   </style>
 | |
|   <title>WebRTC Face Reco Demo Application</title>
 | |
| </head>
 | |
| <body>
 | |
| <script type="text/javascript">
 | |
| var localVideo;
 | |
| var localCanvas;
 | |
| 
 | |
| initialize = function() {
 | |
|   localVideo = document.getElementById("localVideo");
 | |
|   localCanvas = document.getElementById("localCanvas");
 | |
|   try {
 | |
|     navigator.getUserMedia({video:true}, onGotStream, onFailedStream);
 | |
|     //trace("Requested access to local media");
 | |
|   } catch (e) {
 | |
|     alert("getUserMedia error " + e);
 | |
|     //trace_e(e, "getUserMedia error");
 | |
|   }
 | |
| }
 | |
| 
 | |
| poll = function() {
 | |
|   var w = localVideo.videoWidth;
 | |
|   var h = localVideo.videoHeight;
 | |
|   var canvas = document.createElement('canvas');
 | |
|   canvas.width  = w;
 | |
|   canvas.height = h;
 | |
|   var ctx = canvas.getContext('2d');
 | |
|   ctx.drawImage(localVideo, 0, 0, w, h);
 | |
|   var comp = ccv.detect_objects({ "canvas" : ccv.grayscale(canvas),
 | |
|                     "cascade" : cascade,
 | |
|                     "interval" : 5,
 | |
|                     "min_neighbors" : 1 });
 | |
|   /* draw detected area */
 | |
|   localCanvas.width = localVideo.clientWidth;
 | |
|   localCanvas.height = localVideo.clientHeight;
 | |
| 
 | |
|   var ctx2 = localCanvas.getContext('2d');
 | |
|   ctx2.lineWidth = 2;
 | |
|   ctx2.lineJoin = "round";
 | |
|   ctx2.clearRect (0, 0, localCanvas.width,localCanvas.height);
 | |
| 
 | |
|   var x_offset = 0, y_offset = 0, x_scale = 1, y_scale = 1;
 | |
|   if (localVideo.clientWidth * localVideo.videoHeight > localVideo.videoWidth * localVideo.clientHeight) {
 | |
|     x_offset = (localVideo.clientWidth - localVideo.clientHeight *
 | |
|                 localVideo.videoWidth / localVideo.videoHeight) / 2;
 | |
|   } else {
 | |
|     y_offset = (localVideo.clientHeight - localVideo.clientWidth *
 | |
|                 localVideo.videoHeight / localVideo.videoWidth) / 2;
 | |
|   }
 | |
|   x_scale = (localVideo.clientWidth - x_offset * 2) / localVideo.videoWidth;
 | |
|   y_scale = (localVideo.clientHeight - y_offset * 2) / localVideo.videoHeight;
 | |
| 
 | |
|   for (var i = 0; i < comp.length; i++) {
 | |
|     comp[i].x = comp[i].x * x_scale + x_offset;
 | |
|     comp[i].y = comp[i].y * y_scale + y_offset;
 | |
|     comp[i].width = comp[i].width * x_scale;
 | |
|     comp[i].height = comp[i].height * y_scale;
 | |
| 
 | |
|     var opacity = 0.1;
 | |
|     if (comp[i].confidence > 0) {
 | |
|       opacity += comp[i].confidence / 10;
 | |
|       if (opacity > 1.0) opacity = 1.0;
 | |
|     }
 | |
| 
 | |
|     //ctx2.strokeStyle = "rgba(255,0,0," + opacity * 255 + ")";
 | |
|     ctx2.lineWidth = opacity * 10;
 | |
|     ctx2.strokeStyle = "rgb(255,0,0)";
 | |
|     ctx2.strokeRect(comp[i].x, comp[i].y, comp[i].width, comp[i].height);
 | |
|   }
 | |
|   setTimeout(poll, 1000);
 | |
| }
 | |
| 
 | |
| 
 | |
| onGotStream = function(stream) {
 | |
|   localVideo.style.opacity = 1;
 | |
|   attachMediaStream(localVideo, stream);
 | |
|   localStream = stream;
 | |
| 
 | |
|   //trace("User has granted access to local media. url = " + url);
 | |
|   setTimeout(poll, 2000);
 | |
| }
 | |
| 
 | |
| onFailedStream = function(error) {
 | |
|   alert("Failed to get access to local media. Error code was " + error.code + ".");
 | |
|   //trace_warning("Failed to get access to local media. Error code was " + error.code);
 | |
| }
 | |
| 
 | |
| 
 | |
| setTimeout(initialize, 1);
 | |
| </script>
 | |
| 
 | |
|   <video id="localVideo" autoplay="autoplay" muted="true"></video>
 | |
|   <canvas width="1000" height="1000" id="localCanvas"></canvas>
 | |
|   <a href="http://www.webrtc.org"><img id="logo" alt="WebRTC" src="../images/webrtc_black_20p.png"></a>
 | |
|   <a href="http://liuliu.me/eyes/javascript-face-detection-explained"><div id="credit">JS Face Detect by Liu Liu</div></a>
 | |
| </body>
 | |
| </html>
 |