2020电赛F题总结回顾(openmv实现视觉
我决定把资源倒腾倒腾发上来,⼀⽅⾯分享⼤致思路,另⼀⽅⾯也当是纪念了
s.h.e mv做的是2020电赛F题:简易⽆接触温度测量与⾝份识别装置
⽂章⽬录
题⽬
整体设计硬件选择
机器视觉模块使⽤openmv,这⼀⽅⾯是我们在备赛过程中认为openmv的功能⾜够,⼀直在准备openmv,另⼀⽅⾯是当时马上下单k210开始学习等到货都已经第三天了,调试来不及风险太⼤了,所以决定使⽤openmv
好在我们买的是最顶配型号openmvH7Plus,最终也顺利完成了题⽬要求的所有任务
温度测量⽅⾯是MLX90614使⽤某宝的模块i2c读取温度,最终我们没有省⼀拿了省⼆也是砸在这个模块上,在送测现场出了问题,⾎的教训,万事都要做好plan B啊~~
主控使⽤stm32c8t6,这是因为我们在赛前已经⽤顺⼿了,其他的也⾏
其他硬件包括oled显⽰温度阈值等,按键,有源蜂鸣器,激光⼩灯等就不赘述了
最后的电路板设计,器件布局如下
软件流程
stm32和openmv通过串⼝通信,我们指定⼀个字母对应进⼊⼀个模式,通电后openmv就在死循环不断等待字母,收到字母即执⾏对应模式功能,再返回结果。具体可看软件流程图:
视觉算法
由于分⼯上我主要负责openmv视觉部分的代码编写等部分,所以这⾥多说⼏句视觉⽅⾯的python代码编写的⼼路历程
分辨不同⼈脸(⾝份识别)
拿到题⽬第⼀反应就是中⽂⼊门教程⾥⾯看到过这个LBP分辨不同⼈脸的应⽤,于是我第⼀天也确确实实按照⼿册的思路拍照测试了,但是实际效果并不好,⽽且受光线和背景影响很⼤,脸还必须填满摄像头,就很不⽅便
于是后来⼜发现了特征点算法,运算时间有了很⼤提升,但还有⼀个问题就是如果背景拍到的范围过⼤,那么将会从背景提取很多⽆⽤的特征点,⽽要求⼈保持⼀定的距离把⼈脸填满屏幕实在太蠢了,怎么解决呢?
我的⽅法是先加⼀层⼈脸识别,将⼈脸部分局部放⼤截取出来再拿去提取特征点并进⾏特征点⽐对,通过这种⽅法,就不⽤对被识别者有很⼤的要求,实现类似k210⼀样的功能啦~
关于上⾯这个思路,直接上代码:
#画出特征点
def draw_keypoints(img, kpts):
if kpts:
print(kpts)
img.draw_keypoints(kpts)
img = sensor.snapshot()
time.sleep(1000)
def find_max(pmax, a, s):
global face_num
if a>pmax:
pmax=a
face_num=s