用LED矩阵屏 显示网络摄像头图像

介绍

在现代Web浏览器中,JavaScript公开了一些非常强大的特性。其中之一就是webkitGetUserMedia 功能,它可以让你访问一个电脑的webcam(在允许的情况下)

在这个例子中,我们将用Espruino板子来将服务器连接一个可以访问Webcam的页面,并发送一个低像素的图片给Espruino板,然后就可以显示在一个LED矩阵屏上。

你将需要

  • 一个 RGB123 矩阵
    — 我用的是16*16的
  • 一个 WIZnet W5500模块
  • 一个带有Webcam的笔记本/平板电脑

连线

软件

第一步是做一个页面,可以获取从webcam来的图像。如下的代码是比较基础的,基本没有错误。

<html>

<body>

<!– The video element that will contain the WebCam image –>

<video autoplay></video>

<!– The canvas that we’ll use to make the WebCam image smaller – 16×16 because that’s the size of the RGB123 matrix –>

<canvas id=’canvas’ width=’16′ height=’16′></canvas>

<!– The script to handle the processing –>

<script language=’javascript’>

// initialise the WebCam – see https://developer.mozilla.org/en-US/docs/Web/API/Navigator.getUserMedia if(navigator.webkitGetUserMedia!=null) {

var options = { video:true,audio:false }; navigator.webkitGetUserMedia(options, function(stream) {

var video = document.querySelector(‘video’);

video.src = window.webkitURL.createObjectURL(stream);

}, function(e) { console.log(“error”); }

);

}

// Every 5 seconds…

setInterval(function() {

// find the video and canvas elements

var video = document.querySelector(‘video’);

var canvas = document.getElementById(‘canvas’);

var ctx = canvas.getContext(’2d’);

// resample the WebCam image down to 16×16 pixels ctx.drawImage(video,0,0,16,16);

var data = ctx.getImageData(0,0,16,16);

// Now build a string from the image data. There are better ways,

// but all we do here is for each pixel’s red, green and blue values

// we store a character between A (char code 65) and P (char code 80)

var s = “”;

for(n=0; n<data.width*data.height; n++) {

s += String.fromCharCode(65+data.data[n*4+2]/16);

s += String.fromCharCode(65+data.data[n*4]/16);

s += String.fromCharCode(65+data.data[n*4+1]/16);

}

// finally send the data down HTTP, using the ‘special’ webpage ‘/set’

var xmlHttp = new XMLHttpRequest();

xmlHttp.open( “GET”, “/set?rgb=”+s, false );

xmlHttp.send( null );

}, 5000);

</script>

</body>

</html>

然后,你需要打包成一个字符串,并保存在Espruino中。你可以保存成一个文件,放在一个SD卡中,但是将页面存成一个字符串意味着Espruino不需要一个卡来操作。我简单的删除了评论(为了节省空间)并在le Converter] 页打开文件。

这是用于Espruino本身的代码 — 看到内联注释:

// The webpage from above

var page = “<html>\n<body>\n<video autoplay></video> \n<canvas id=’canvas’ width=’16′ height=’16′></canvas> \n<script language=’javascript’> \nif(navigator.webkitGetUserMedia!=null) { \n var options = { video:true,audio:false }; \n navigator.webkitGetUserMedia(options,
\n function(stream) { \n var video = document.querySelector(‘video’); \n video.src = window.webkitURL.createObjectURL(stream); \n }, function(e) { console.log(\”error\”); } \n ); \n} \n\nsetInterval(function() {\n var video = document.querySelector(‘video’);
\n var canvas = document.getElementById(‘canvas’); \n var ctx = canvas.getContext(’2d’); \n ctx.drawImage(video,0,0,16,16); \n var data = ctx.getImageData(0,0,16,16); \n var s = \”\”;\n for(n=0; n<data.width*data.height; n++) { \n s += String.fromCharCode(65+data.data[n*4+2]/16);\n
s += String.fromCharCode(65+data.data[n*4]/16); \n s += String.fromCharCode(65+data.data[n*4+1]/16); \n } \n var xmlHttp = new XMLHttpRequest();\n xmlHttp.open( \”GET\”, \”/set?rgb=\”+s, false );\n xmlHttp.send( null );\n}, 5000);\n</script>\n</body>\n</html>\n”;

// This is called whenever a webpage is requested

function onPageRequest(req,res) {

res.writeHead(200, {‘Content-Type’: ‘text/html’});

// work out what page was requested

var rurl = url.parse(req.url,true);

if (rurl.pathname==”/”) {

// If the page was the main webpage, send it out

res.write(page);

}else if (rurl.pathname==”/set”) {

// if the page was our ‘/set’ webpage…

// Create a 16×16 image structure

var img = {

width : 16, height : 16, bpp : 24,

buffer : new Uint8Array(16*16*3)

};

// Fill it with the data we got sent

var s = rurl.query.rgb;

for (var i=0;i<768;i++)

img.buffer[i] = s.charCodeAt(i)-65;

// Draw it onto the LED display’s buffer

leds.drawImage(img, 0, 0);

// Finally send the data to the display

leds.flip();

}

// Finish sending our webpage response

res.end();

}

// Set up LEDs

SPI2.setup({baud:3200000, mosi:B15});

var leds = Graphics.createArrayBuffer(16,16,24,{zigzag:true});

leds.flip = function() { SPI2.send4bit(leds.buffer, 0b0001, 0b0011); };

leds.clear();

// Set up ethernet and our webserver var eth;

function onInit() {

var eth = require(“WIZnet”).connect();

console.log(eth.getIP()); require(“http”).createServer(onPageRequest).listen(80);

}

onInit();

只要将这些代码复制并粘贴到右手边的WEB IDE中,并点击  Send to Espruino。它应该就立刻能工作了!

当Espruino启动时,它的IP地址将打印出来,这样你就会知道你将连接哪来分享你的Webcam了。

这个页面是从 GitHub 中自动生成的。如有任何问题及建议,请让我知道

查看:原文

时间: 2024-08-07 04:32:20

用LED矩阵屏 显示网络摄像头图像的相关文章

网络LED矩阵显示器

前言 主要是Linux网络程序和多线程程序的编写,实现一个网络访问的LED矩阵显示器.客户端采用telnet进行连接. socket的编程主要和计网实验课上的差不多,计网实验socket编程传送门 字符串的显示 在上次显示一个字符的基础上进行一个字符串的显示.字符的显示 对于字符串的显示可以直接写入一个字符串,在内核中采用内核队列进行实现.或者每次只能写入一个字符,在应用程序进行一个循环写入.由于上次没有实现内核队列的字符串显示,这里就采用了应用程序循环进行实现. 在上次的基础上,编写一个Dis

Android之网络摄像头

实现的功能就是两个手机在一个局域网内可以互相观看对方的摄像头图像,当然如果都是连接公网那么就能远程互看了,,,,和视频聊天差不多,,不过没有声音,,,,,,,, 源码是在网上找的(具体地址忘了,如有侵犯请告知),亲测能用,,其实一开始想直接用到自己现在做的东西上 ,不过直接加到自己现在的软件上,调试了一下发现,,我想多了,老天总是不让自己那么轻易的....................... 因为自己手头上只有一个手机,所以就自己发给自己了 上面的是自己的摄像头预览的, 下面的是通过TCP传输

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

本文主要介绍WebRTC (我们翻译和整理的,译者:weizhenwei,校验:blacker),最早发表在[编风网] 支持原创,转载必须注明出处,欢迎关注我的微信公众号blacker(微信ID:blackerteam 或 webrtcorgcn). 从技术上来讲,使用网络摄像头进行在线广播并不需要WebRTC.摄像头本身就是一台服务器,它能够连接到路由器并在线传输视频内容.那么,为什么我们还需要WebRTC呢? 这至少有两方面原因: 1.随着观看网络广播的观众越来越多,网络带宽会逐渐不足.如果

第七章 KinectV2结合MFC显示和处理图像数据(下)

第七章  KinectV2结合MFC显示和处理图像数据(下) 首先声明一下,本系统所使用的开发环境版本是计算机系统Windows 10.Visual Studio 2013.Opencv3.0和Kinect SDK v2.0.这些都可以在百度上找到,download下来安装一下即可. 一.在MFC中如何显示OpenCV的图像Mat 前段时间一直在学习opencv,但学习过程中写的例子都是基于控制台的.今天打算把之前写的一些例子都移植到MFC中,基本上就是复制以前的代码,唯一的区别在于在控制台中,

【原创】IP摄像头技术纵览(五)---网络摄像头初试—mjpg-streamer移植与部署

[原创]IP摄像头技术纵览(五)-网络摄像头初试-mjpg-streamer移植与部署 本文属于<IP摄像头技术纵览>系列文章之一: Author: chad Mail: [email protected] 1.vgrabbj.spacview.Luvcview.mjpg-streamer评测对比 vgrabbj-0.9.6是基于v4l1设计的,与v4l2的API差别很大,该软件已经没有使用或参考价值. spcaview 也相当古老,并且调用了SDL库,不适合嵌入式系统,不建议研究. 什么是S

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

几个月前,我一直关注着比特币的爆发并且在GDAX网站上注册账号.在注册验证的过程中,网站提示要通过计算机的网络摄像头提交我自己的一张照片作为照片ID.这是一个很酷的做法,让我思考一个问题:在网络浏览器上集成网络摄像头使用需要怎么做? 事实上,有一些HTML5的API可用于通过JavaScript与网络摄像头进行交互. 下面,我们来看下如何创建一个VueJS的Web应用,在Web浏览器上通过网络摄像头直接捕获. 使用Vue CLI创建Vue项目 为了使项目更易于的理解,我们将从头开始搭建项目.为方

在Windows IoT上使用网络摄像头

在树莓派上可以使用它官方标配的摄像头,但是这个摄像头似乎不能被Windows IoT识别和使用.但是,可以在树莓派的USB口上插入任意型号的摄像头,就可以实现树莓派的拍摄功能. 关于摄像头的寻找和拍摄,我将其封装成一个类,如下: public class WebCamHelper { public MediaCapture mediaCapture; private bool initialized = false; /// <summary> /// 异步初始化网络摄像头 /// </

户外表贴LED电子屏的七大特点

几年前,户外LED电子显示屏几乎全部使用直插式椭圆形红.绿.蓝LED器件,而近年来,像素点间距为8mm至16mm的户外全彩表贴LED显示屏正在逐步兴起,并获得广泛应用. 相较于直插式,表贴LED电子屏具有更多优点. 第一,视角广.户外表贴全彩屏不但在水平方向具有110度以上的广视角,在垂直方向也具有110度以上广视角,这在一些应用场所特别有优势,比如楼宇屏,悬挂在高空的户外LED电子显示屏就需要更广的视角才能显示出更好的广告效果. 第二,配光好.红.绿.蓝椭圆形LED在不同角度三种亮度的匹配一致

分屏显示

我们在做排队叫号(不限于排队,其他需要多个屏幕显示的应用都可以)的时候,总是需要将呼叫内容显示到显示器.电视机或者LED显示屏上面.之前一章,我已经讲过如何用C#控制LED显示器了,这一篇,我讲一下分屏显示. 我最近做了几个排队叫号系统,用到LED.电视机显示屏和电脑显示屏.LED控制比较复杂,需要考虑LED控制卡接口,多数还要写带格式的txt文件.显示器或者电视机就比较容易实现,只需要设置一下电脑和一些简单的代码就可以实现的. 接下来,我就分享一下步骤: (1)电脑设置 XP:屏幕空白地方右键