UNPKG

@lamassu/v4l2camera

Version:

Capturing images from USB (UVC) cameras on linux machines

111 lines (106 loc) 3.35 kB
var http = require("http"); var v4l2camera = require("../"); var server = http.createServer(function (req, res) { //console.log(req.url); if (req.url === "/") { res.writeHead(200, { "content-type": "text/html;charset=utf-8", }); res.end([ "<!doctype html>", "<html><head><meta charset='utf-8'/>", "<script>//<!--", "(" + script.toString() + ")()", "//--></script>", "</head><body>", "<canvas id='cam' width='352' height='288' />", "</body></html>", ].join("\n")); return; } if (req.url.match(/^\/.+\.yuv$/)) { var buf = Buffer(cam.toYUYV()); //var buf = Buffer(cam.toRGB()); res.writeHead(200, { "content-type": "image/vnd-raw", "content-length": buf.length, }); res.end(buf); } }); server.listen(3000); var script = function () { window.addEventListener("load", function (ev) { var minmax = function (min, v, max) { return (v < min) ? min : (max < v) ? max : v; }; var yuv2r = function (y, u, v) { return minmax(0, (y + 359 * v) >> 8, 255); }; var yuv2g = function (y, u, v) { return minmax(0, (y + 88 * v - 183 * u) >> 8, 255); }; var yuv2b = function (y, u, v) { return minmax(0, (y + 454 * u) >> 8, 255); }; var yuyv2rgba = function (yuyv, rgba, width, height) { for (var i = 0; i < height; i++) { for (var j = 0; j < width; j += 2) { var index = i * width + j; var y0 = yuyv[index * 2 + 0] << 8; var u = yuyv[index * 2 + 1] - 128; var y1 = yuyv[index * 2 + 2] << 8; var v = yuyv[index * 2 + 3] - 128; rgba[index * 4 + 0] = yuv2r(y0, u, v); rgba[index * 4 + 1] = yuv2g(y0, u, v); rgba[index * 4 + 2] = yuv2b(y0, u, v); rgba[index * 4 + 3] = 255; rgba[index * 4 + 4] = yuv2r(y1, u, v); rgba[index * 4 + 5] = yuv2g(y1, u, v); rgba[index * 4 + 6] = yuv2b(y1, u, v); rgba[index * 4 + 7] = 255; } } return rgba; }; var rgb2rgba = function (rgb, rgba, width, height) { for (var i = 0; i < height; i++) { for (var j = 0; j < width; j++) { var index = i * width + j; rgba[index * 4 + 0] = rgb[index * 3 + 0]; rgba[index * 4 + 1] = rgb[index * 3 + 1]; rgba[index * 4 + 2] = rgb[index * 3 + 2]; rgba[index * 4 + 3] = 255; } } return rgba; }; var cam = document.getElementById("cam"); var c2d = cam.getContext("2d"); var image = c2d.createImageData(cam.width, cam.height); (function load() { var req = new XMLHttpRequest(); req.responseType = "arraybuffer"; req.addEventListener("load", function (ev) { var yuyv = new Uint8Array(req.response); yuyv2rgba(yuyv, image.data, image.width, image.height); //var rgb = new Uint8Array(req.response); //rgb2rgba(rgb, image.data, image.width, image.height); c2d.putImageData(image, 0, 0); setTimeout(load, 100); }, false); req.open("GET", "/" + Date.now() + ".yuv", true); req.send(); })(); }, false); }; var cam = new v4l2camera.Camera("/dev/video0") if (cam.configGet().formatName !== "YUYV") { console.log("YUYV camera required"); process.exit(1); } cam.configSet({width: 352, height: 288}); cam.start(); cam.capture(function loop() { cam.capture(loop); });