2021爱智先行者-可识别车牌号的智能摄像头

一 前言

        【本文正在参与"2021爱智先行者-征文大赛"活动】

        EdgerOS 操作系统的优势在于“边缘计算”,当我们手上有一些设备的时候,我们可以随心所欲地DIY它们的功能,达到“1+1>2”的效果。当我看到公众号的直播课程有一期提到DIY人脸智能门锁的时候,我被这种简约而高效的开发模式惊讶到,萌发出要DIY一款智能摄像头的想法。在浏览爱智官网的应用开发参考手册的时候,看到比较符合我想法的车牌识别的AI引擎。这次我利用人脸识别项目模板和车牌识别,开发了一款可以识别车牌号的智能摄像头应用。

二 思路

1 功能

        当我们手头有一款可以智能识别车牌号码的智能摄像头的时候,可以给我们的日常生活带来极大的便携,这得益于Spirit 1的边缘计算能力,想象一下:当家里车库的摄像头识别出到我们车辆入库的时候,我们可以联动智能门锁开锁,也可以联动智能灯开灯照明;当停车场记录某车辆进出时间的时候,可以通过计算得出本次停车应缴的费用;小区也可以通过识别车牌,记录车辆发进出情况......我这次主要模拟的是监控一下车辆进出小区的情况。

2 实现

        A 车辆识别:EdgerOS官方的项目为我们展现了如何通过视频流来识别人脸,我们只需要将视频流中人脸识别逻辑替换成识别为车牌就行了。

        B 车牌记录:我这里使用EdgerOS官方提供的LightKV数据库来登记一下本小区的车辆,每次捕捉到车辆的时候,记录一下它们的进出状态和进出时间。

        C 前后端交互:主要是通过Socket.IO来实现,当摄像头识别到某车牌的时候,应用后端通过 socket.emit() 向前端发送消息,前端监听到自定义事件发生的时候,就在应用页面上显示进出信息。

3 部分代码展示:

    A 记录小区车辆信息

        假如大家需要记录其他比较重要的信息,可以根据业余逻辑更改这里的value值。

var carDB = new LightKV('carDB', 'c+', LightKV.OBJECT);
carDB.set('云F0000D', {
	"name": "云F0000D",
	"owner": "张三",
	"time":new Date().getTime(),

});

carDB.set('粤BM68Y6', {
	"name": "粤BM68Y6",
	"owner": "李四",
	"time": new Date().getTime(),
	"status" : "OUT"
});
carDB.set('黑AF6656', {
	"name": "黑AF6656",
	"owner": "王五",
	"time": new Date().getTime(),
	"status" : "IN"
});

carDB.set('云A555TX', {
	"name": "云A555TX",
	"owner": "小张",
	"time": new Date().getTime(),
	"status" : "OUT"
});
carDB.set('粤B594SB', {
	"name": "粤B594SB",
	"owner": "小李",
	"time": new Date().getTime(),
	"status" : "IN"
});

B 剔除不合法的车牌

isVehicleNumber(vehicleNumber) {
		var xreg = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}(([0-9]{5}[DF]$)|([DF][A-HJ-NP-Z0-9][0-9]{4}$))/;
		var creg = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳]{1}$/;
		if (vehicleNumber.length == 7) {
			return creg.test(vehicleNumber);
		} else if (vehicleNumber.length == 8) {
			return xreg.test(vehicleNumber);
		} else {
			return false;
		}
	}

C 视频流处理

onVideo(frame) {
		var buf = new Buffer(frame.arrayBuffer);
		// 检测车牌
		const licInfo = licplatenn.detect(buf, { width: 640, height: 320, pixelFormat: licplatenn.PIX_FMT_RGB24 });
		if (licInfo.length > 0) {
			const curlic = licInfo[0];
			// 剔除非车牌信息
			if (curlic.prob > 0.99) {
				//识别车牌
				const truelic = licplatenn.identify(buf, { width: 640, height: 320, pixelFormat: licplatenn.PIX_FMT_RGB24 }, curlic);
				if (this.isVehicleNumber(truelic) && carDB.has(truelic)) {
					if (carDB.get(truelic).status == 'OUT') {
						socket.socketio.emit('carIN', new Date().toLocaleString() + '--' + truelic + '--' + '进入车库');
						console.log(truelic + '欢迎回来');
						carDB.set(truelic, { status: 'IN', time: Date.now() });
					}
					else {
						socket.socketio.emit('carOUT', new Date().toLocaleString() + '--' + truelic + '--' + '离开车库');
						console.log(truelic + '一路顺风');
						carDB.set(truelic, { status: 'OUT', time: Date.now() });
					}
				}
				else if (this.isVehicleNumber(truelic) && !carDB.has(truelic)) {
					socket.socketio.emit('NoPermission', new Date().toLocaleString() + '--' + truelic + '非本小区车辆,禁止入内');
					console.log(truelic + '非本小区车辆,禁止入内');
				}
			}
		}
	}

 D 前端页面展示



具体代码实现:GitHub - victimsss/victimsss-app-demo-camera-car 

三 部署和测试

设备需求: 一台无线网络摄像头,一台 Spirit 1

        我们将应用部署到 Spirit 1 之后,启动我们刚才安装的应用,获取摄像头的需要权限。2021爱智先行者-可识别车牌号的智能摄像头_第1张图片

         点击设备列表,并输入账号密码完成登录。2021爱智先行者-可识别车牌号的智能摄像头_第2张图片

        启动应用之后,进入应用的车辆进出记录页面。

2021爱智先行者-可识别车牌号的智能摄像头_第3张图片

         由于这次是在模拟场景中,我将使用手机上的照片进行识别,测试使用的图片在本项目 test picture 目录中,你也可以使用其他的照片进行测试,简单修改本地数据库的信息即可。当摄像头摄像头识别到手机上的照片的时候,会得到详细的信息。我这里采取的是小区车辆和非小区车辆随意切换,结果如下图所示:

        图1 VSCode的插件打印的信息

2021爱智先行者-可识别车牌号的智能摄像头_第4张图片

图2  应用的记录信息 

2021爱智先行者-可识别车牌号的智能摄像头_第5张图片

四 结语 

        这是一款开发简单并且花费少的智能摄像头应用,在这里我们很明显感受到 EdgerOS 系统的优势,对于个人开发者来说,我们开发应用的功能取决于我们的想象力,我们可以随意地DIY一套比较智能的设备,而且效果也比较符合我们的预期。未来一段时间,我会继续学习EdgerOS的参考手册,进一步地完善这款应用。

你可能感兴趣的