0%

LPR(Vehicle License Plate Recognition)

前言

这是一个车牌识别的实例

我的平台是vs2017和opencv3.4

opencv下载链接点这里

这是老早在学校做的一个作业。github地址

这里分解了车牌识别的步骤。提供了大体的解决思路,其实你每一步都可以尝试用其他的方法来更好地解决问题,譬如最后的识别字符你完全可以使用ocr或者训练好的神经网络来更好的完成输出。


任务:识别下图中的车牌

car

要实现车牌识别,一共分为两大步。
第一,车牌定位,就是在图片中确定出车牌的位置;
第二,字符识别,将提取出来的字符图片进行识别。

正文

一、车牌定位

1. 高斯滤波

为什么要高斯滤波呢?原因很简单,因为要平滑图像,去除噪声点。

car

2. sobel边缘提取

至于什么是sobel呢?
我先引用百度的一句话吧:

Sobel算子是像素图像边缘检测中最重要的算子之一,在技术上,它是一个离散的一阶差分算子,用来计算图像亮度函数的一阶梯度之近似值。在图像的任何一点使用此算子,将会产生该点对应的梯度矢量或是其法矢量。

那我们用sobel算子干嘛呢?我们的目标是定位车牌,因为车牌的周围轮廓分明,使用sobel可以清晰的提取边缘,效果如图所示:
car

3.二值化图像

这时我们就可以看到车牌成为了图像中亮度最大的区域,所以我们这次再来进行二值化,只保留高于一定阈值的点,效果图如下:

car

4.闭运算

图像中的这些点我们怎么利用呢?这时我们需要将这些点所在的区域连通起来,所以会用到闭运算。
什么是闭运算呢?

在数学形态学中,闭运算被定义为先膨胀后腐蚀。

先点这里了解腐蚀和膨胀

再点这里了解开运算、闭运算等

car

5.去除小区域

了解上面的之后,相信你也知道这里该怎么做啦!

car
car

6.提取轮廓

我们在上面已经找到了车牌所在区域,现在我们需要找到车牌的边界点。
我们有这一堆点集,我们可以迭代寻找出最左边且靠上的点之类的。
因为我们下一步要做仿射变换,需要三个边界点,所以我们找出如图所示的三个点就行了。

蓝色框可以点下面了解一下,后面会很有用。
绘制最小外接矩形

car

7.仿射变换

原理还是看博客吧,仿射变换能做到对图像旋转,平移和缩放。
这里根据提取到的点,再对高斯滤波后的图进行仿射变换,只保留车牌部分。

点一下,玩一年

深入版

car

二、字符识别

1.提取字符轮廓

这里先对图像二值化,再寻找最小外接矩形。
当然汉字可不是很简单,因为有很多独立的笔画,所以还需要在容器中移除小于一定面积的矩形。
这样一些点啊,就不会在我们需要识别的对象中。

car

2.识别字符

当时做这个时间因素,采用了最简单也是很有效的一种方法,对每个字符变换到标准大小,和模板点与点之间逐个计算,最后输出与之匹配度最高的字符。
car

输出结果如下:
car

基于头部信号的小车运动控制实现

前言

此项目为本人18年的本科毕业设计,最近刚好开始写博客,所以就这个翻出来和大家分享一下。

废话不多说先看效果

前期准备

硬件

  1. OpenBCI相关设备

    OpenBCI是个面向脑机接口EEG信号采集的开源硬件。OpenBCI Cyton是一个Arduino兼容的带有8通道神经接口和一个32位处理器开发板。

    board

    usb_dongle
  2. 基于Arduino单片机的可编程小车

    car

    产品所用元器件: WIFI模块*1,arduino uno r3单片开发板*1,arduino 拓展版*1,直流减速电机*4,轮胎*4,电池盒*1,18650Li-ino电池*2,电压显示器*1,底盘*1。

软件

  1. OpenBCI_GUI

  2. OpenBCI_Python

  3. Arduino 软件(IDE)

    理论知识

  4. 脑机接口

    脑机接口从定义上说就是如何使用头部信号与外部机械进行直接交互的一项技术,并且对脑机接口的相关研究已经超过40年了。从上个世纪以来,人们不断地从各类试验之中总结经验,对此相关的知识逐渐积累,并且以多年在动物身上的试验结果中总结的方法,把一些相关的植入性设备进行人体植入,主要用于恢复已经受伤的感觉器官,如眼睛,耳朵和运动肢体等。

    bci

  5. 脑电采集设备

    1. 侵入式

      此类接口通常是将电极直接接入到大脑的灰质上,因为减少了传播介质的干扰,由此得到的神经信号质量较好。但是,由于植入电极须通过手术的方式,导致其本身会伴随较大风险。

    2. 半侵入式

      此类接口的位置一般是在大脑灰质之外,颅腔之内,虽然它的神经信号质量不如侵入式脑机接口,可是还是要比非侵入式要好。

    3. 非侵入式

      此类接口由于不需要植入大脑内部,所以不会对头部造成伤害,许多的此类设备直接与头部皮层相接,就像一顶帽子一样戴在头上既可。

研究方法与思路

系统设计

  1. 连接

    系统启动时,上位机与下位机通过WiFi建立通信连接,采集设备通过蓝牙建立通信连接。

  2. 传输

    USB Dongle接收实时脑电信号,将其传输到电脑上。

  3. 处理

    PC端将接收到的实时数据,进行处理工作。

  4. 识别

    系统将处理后的数据,进行信号识别工作,并将结果传输给下位机。

  5. 控制

    下位机接收上位机的控制指令后,对小车运动状态进行实时控制。

机器小车

  1. 连接

    下位机与上位机之间通过WiFi建立通信连接。

  2. 启动

    通过串口读取来自上位机的控制指令,并且将第一个左转信号视为启动信号。

  3. 行进

    启动后,小车向前行进,并且实时检测串口信号。

  4. 控制

    根据控制命令,控制小车左转或右转后,继续行进。

信号预处理

  1. 时间片数据

    将每秒钟的250个数据封装成一段。

  2. 去基线漂移

    数字信号中会含有基线干扰信号(低频噪音),会对信号分析产生不利影响。需要通过预处理消除信号基线

  3. 陷波滤波

    在我国采用的是50 Hz频率的交流电,所以在平时需要对信号进行采集处理和分析时,常会存在50 Hz的工频干扰。

  4. 带通滤波

    经过多次试验发现,选取在7-13Hz范围的波形信号最为明显。

信号识别

  1. 保持睁眼时

  1. 单次眨眼

  2. 两次眨眼

测试

OpenBCI眼电验证

  1. 设置过滤噪声开关-Notch(与交流电相关,大陆地区为50 Hz)

  2. 设置合适的标尺-VertScale(正常设置为200~1000,具体根据实际测量数据大小自由调整)

  3. 关闭不使用的通道(防止影响使用中的通道的数据观察)

  4. 保持皮肤干爽(建议粘贴脑电极前使用洁面膏等清洗脸部,并擦干保持干燥)

  5. 使用黏性较强的胶带粘贴,如下图所示

  1. 通过对比(a)(b)(c)(d)可知,带通滤波器的选择在7-13Hz时,波形最为容易分析,所以在信号处理系统设计中,带通滤波器的频带剪切频率f1选择为7Hz和剪切频率f2选择为13Hz。

机器小车测试

将小车运行测试代码烧写入小车中如下图所示,

当小车从串口接收到第一个左转指令时,将其视为启动命令,控制小车前进,其后不断从串口缓冲区读取命令,当读取到字符l时控制小车左转,并输出left,当读取到字符r时控制小车右转,并输出right。测试结果如下图所示。

信号处理系统测试

信号处理系统运行如上图所示,首先各设备之间建立连接,然后读取EEG数据,先对其进行信号预处理,再进行信号识别。测试结果如下图所示,设备连接正常,数据传输正常,信号处理系统运行正常。

系统集成测试

建议及总结

  1. 改进方法,减少系统误差,减少控制时延。
  2. 开源硬件成本低廉,开发方便。
  3. 该系统适用性强,经过适当改造可以控制其他设备。
  4. 对于特定人群例如残疾人、聋哑人的应用前景更为广阔。

问题回复

  1. 求代码?
    a. 本文只做技术探讨,不涉及代码。设备连接、控制等请参考官方文档,github上有官方OpenBCI_Python。滤波可以用Python signal库。
  2. 关于眨眼信号的识别问题,这里提出几条想法,仅供参考。
    a. 最简单的,判断一个数据包里面包含的上升波形。
    b. 用傅里叶变换把时域信号转为频域信号。判断是否包含某些频率。
    c. 提取n组眨眼信号数据,作为矩阵数据。计算其特征值范围用于判断。
    d. 提取n组眨眼信号数据,训练卷积神经网络模型,用于判断数据。
  3. 非常影响效果的噪声问题。
    a. 除了贴好位置,还有最好使用电池供电保证供电稳定。避免交流电干扰,GUI里面有个Notch设置为50Hz,国内的交流电为50Hz。一定要找一个空旷的地方做实验,室内的话各种用电设备都有可能会造成干扰。
    b. 官方文档:https://docs.openbci.com/docs/10Troubleshooting/minimizingNoise#get-rid-of-ac-noise

未完待续!不定期炸更。