资讯专栏INFORMATION COLUMN

【毕设】基于openmv和arduino的人脸感应显示的代码

Enlightenment / 2518人阅读

摘要:这里写目录标题作品要求一作品设计与模块选择可以感应人脸感应到人脸时开启显示屏显示显示温度速度等实验效果作品要求一作品设计与模块选择可以感应人脸人脸识别模块选用模块,因为用起来相对复杂。设置每个人拍摄图片数量。为当前最匹配的人的编号。

作品要求:

一、作品设计与模块选择

1.可以感应人脸

人脸识别模块选用openmv模块,因为opencv用起来相对复杂。
用官方人脸识别示例代码进行修改,得出以下代码:
获取照片:

像素点是92,112的,并且是灰度图,pgm格式,存在singtown中,然后在singtown文件夹中再新建n个名为s1,s2,s3…sn的子文件夹,其中n为整个图像库中的人数。

#快照示例#注意:你需要一个SD卡来运行这个例子。#你可以使用你的OpenMV摄像机来保存图像文件。import sensor, image, pybRED_LED_PIN = 1BLUE_LED_PIN = 3sensor.reset() # Initialize the camera sensor.sensor.set_pixformat(sensor.GRAYSCALE) # or sensor.GRAYSCALEsensor.set_framesize(sensor.B128X128) # or sensor.QQVGA (or others)sensor.set_windowing((92,112))sensor.skip_frames(10) # Let new settings take affect.sensor.skip_frames(time = 2000)num = 1 #设置被拍摄者序号,第一个人的图片保存到s1文件夹,第二个人的图片保存到s2文件夹,以此类推。每次更换拍摄者时,修改num值。n = 20 #设置每个人拍摄图片数量。#连续拍摄n张照片,每间隔3s拍摄一次。while(n):    #红灯亮    pyb.LED(RED_LED_PIN).on()    sensor.skip_frames(time = 3000) # Give the user time to get ready.等待3s,准备一下表情。    #红灯灭,蓝灯亮    pyb.LED(RED_LED_PIN).off()    pyb.LED(BLUE_LED_PIN).on()    #保存截取到的图片到SD卡    print(n)    sensor.snapshot().save("singtown/s%s/%s.pgm" % (num, n) ) # or "example.bmp" (or others)    n -= 1    pyb.LED(BLUE_LED_PIN).off()    print("Done! Reset the camera to see the saved image.")

其原理是根据图片和现在拍摄的相似度去判断识别人脸

LBP人脸识别代码:

NUM_SUBJECTS = 1 #图像库中不同人数,一共1人
你要识别几张脸,就改为几

import sensor, time, image, pyb  from pyb import UART		#添加串口sensor.reset() # Initialize the camera sensor.sensor.set_pixformat(sensor.GRAYSCALE) # or sensor.GRAYSCALEsensor.set_framesize(sensor.B128X128) # or sensor.QQVGA (or others)sensor.set_windowing((92,112))sensor.skip_frames(10) # Let new settings take affect.sensor.skip_frames(time = 5000) #等待5suart = UART(3, 9600)    #设定好串口通信协议#SUB = "s1"NUM_SUBJECTS = 1 #图像库中不同人数,一共6人NUM_SUBJECTS_IMGS = 20 #每人有20张样本图片def min(pmin, a, s):    global num    if a<pmin:        pmin=a        num=s    return pminwhile(1):    # 拍摄当前人脸。    img = sensor.snapshot()    #img = image.Image("singtown/%s/1.pgm"%(SUB))    d0 = img.find_lbp((0, 0, img.width(), img.height()))    #d0为当前人脸的lbp特征    img = None    pmin = 999999    num=0    for s in range(1, NUM_SUBJECTS+1):        dist = 0        for i in range(2, NUM_SUBJECTS_IMGS+1):            img = image.Image("singtown/s%d/%d.pgm"%(s, i))            d1 = img.find_lbp((0, 0, img.width(), img.height()))            #d1为第s文件夹中的第i张图片的lbp特征            dist += image.match_descriptor(d0, d1)#计算d0 d1即样本图像与被检测人脸的特征差异度。        print("Average dist for subject %d: %d"%(s, dist/NUM_SUBJECTS_IMGS))        pmin = min(pmin, dist/NUM_SUBJECTS_IMGS, s)#特征差异度越小,被检测人脸与此样本更相似更匹配。        print(pmin)        print(num) # num为当前最匹配的人的编号。            if(num==1 and pmin<=5000):		#如果是第一个人,并且差异度小于5000        print("adan")	#则打印我的名字出来        uart.write("adan")	#则用串口打印我的名字给arduino,然后就可以用arduino进行判断了

实际上可以用openmv进行操作显示屏和获取温湿度,速度等等操作,因为它本身就是个STM32单片机,但是操作起来相对麻烦,所以选用了arduino进行通信控制,openmv只当一个视觉识别模块处理。

2.感应到人脸时开启显示屏显示

屏幕我选用oled显示屏,oled显示屏示例代码(简洁):

//显示中英文字符程序#include #include #include #include #define OLED_RESET 4Adafruit_SSD1306 display(OLED_RESET);//#define LOGO16_GLCD_HEIGHT 16 //定义显示高度//#define LOGO16_GLCD_WIDTH  16 //定义显示宽度#if (SSD1306_LCDHEIGHT != 64)#error("Height incorrect, please fix Adafruit_SSD1306.h!");#endifvoid setup()   {                  Serial.begin(9600);  // 默认情况下,我们将从3.3v线内部产生高电压!   display.begin(SSD1306_SWITCHCAPVCC, 0x3C); //初始化I2C地址0x3D(对于128x64)  //初始化完成  display.clearDisplay(); //清屏  //英文字符显示,直接用display.println或print显示字符串就行  //println换行,print不换行  display.setTextSize(1);             //设置字体大小  display.setTextColor(WHITE);        //设置字体颜色白色  display.setCursor(0,0);             //设置字体的起始位置  display.println("Hello, world!");   //输出字符并换行    display.setTextColor(BLACK, WHITE); //设置字体黑色,字体背景白色   display.println(3.141592);          //输出数字并换行    display.setTextSize(2);             //设置字体大小  display.setTextColor(WHITE);        //设置字体白色  display.print("0x");                //输出字符  display.println(0xDEADBEEF, HEX);   //输出为ASCII编码的十六进制  display.display();                  //显示以上  }void loop() {}

根据oled显示代码,加个串口中断,然后在串口中断执行显示,我们的效果就出来了:

#include #include #include #include #define OLED_RESET 4Adafruit_SSD1306 display(OLED_RESET);#if (SSD1306_LCDHEIGHT != 64)#error("Height incorrect, please fix Adafruit_SSD1306.h!");#endifvolatile int flag;String shuju;int xs_biaozhi;       //显示标志unsigned long  delay_data;  //延时数据void setup() {  Serial.begin(9600);  // 默认情况下,我们将从3.3v线内部产生高电压!  display.begin(SSD1306_SWITCHCAPVCC, 0x3C); //初始化I2C地址0x3D(对于128x64)  //初始化完成  display.clearDisplay(); //清屏  flag = 0;  shuju = "0";  Serial.begin(9600);  display.setTextSize(3);   //字体大小  display.setTextColor(SSD1306_WHITE);  //字体颜色  display.setCursor(0, 0);              //字体位置  display.println("Hello, world!");   //输出字符并换行  display.display();                    //显示出来  delay(1000);  display.clearDisplay(); //清屏  display.setTextSize(1);   //字体大小  display.setTextColor(SSD1306_WHITE);  //字体颜色  display.setCursor(0, 0);              //字体位置  display.println(" ");   //输出字符并换行  display.display();                    //显示出来  delay(1000);}void loop() {use_delay();uart_chuli();}void uart_chuli()   //串口处理{  if (flag == 1) {    Serial.println(shuju);    uart_dispose();    shuju = "";    flag = 0;  }}void use_delay()      //自定义延时函数{  if (xs_biaozhi == 1) //如果显示标志为1  {    delay_data--;   //延时数据自减    if (delay_data == 0) //如果延时数据减到0,则清空屏幕不显示    {      xs_biaozhi = 0;            display.clearDisplay(); //清屏      display.setTextSize(1);   //字体大小      display.setTextColor(SSD1306_WHITE);  //字体颜色      display.setCursor(0, 0);              //字体位置      display.println(" ");   //输出字符并换行      display.display();                    //显示出来    }  }}void serialEvent() {  while (Serial.available() > 0)  {    shuju = shuju + char(Serial.read());    delay(2);    flag = 1;  }}void uart_dispose() {  if (shuju == "adan")  {    display.setTextSize(2);   //字体大小    display.setCursor(64, 32);  //字体位置    display.println(shuju);   //输出字符并换行    display.display();        //显示出来    delay(100);    xs_biaozhi = 1;           //显示标志至1    delay_data=50000;          //延时数据为50000,不是时间,时间要靠晶振时钟频率去算,我赖得算。。。  }}

3.显示温度、速度等

加入DHT11模块然后在oled进行温度显示
然后加入霍尔编码器或者光电编码器就可以测小车速度了

这些都太简单了,懒得做,可以自己自行添加。

实验效果

openmv人脸识别开启屏幕

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/122407.html

相关文章

  • 智能科学与技术 毕业设计怎么做 - 选题推荐 - 疑问解答

    摘要:选题推荐持续性更新中以下为学长精选整理的智能科相关的毕设选题,供大家参考。最后毕设帮助毕设帮助,开题指导,技术解答 文章目录 1 前言2 选题注意事项2.1 选择...

    scq000 评论0 收藏0
  • UCloud人脸识别测温产品

    摘要:近期,中烟机械与就人脸识别测温产品达成了长期合作,并已在其下属各烟机厂投入使用。总结人脸识别测温产品结合自身在方面的专业云服务技术能力,致力于为各企业组织在疫情期间提高人员体温监控效率减少感染风险。目前,国内疫情已基本得到控制,为防止疫情再次大规模爆发,大部分公共场所及企业办公楼的体温检测、戴口罩、消毒等防控措施开始趋向常态化管理。无接触、无人值守、快速感应的人脸识别测温设备在疫情期间得到了...

    KunMinX 评论0 收藏0
  • UCloud人脸识别测温产品落地中烟机械

    摘要:近期,中烟机械与就人脸识别测温产品达成了长期合作,并已在其下属各烟机厂投入使用。为什么选择人脸识别测温产品此次中烟机械选择与合作,主要是基于产品功能灵活可扩展自研人脸识别算法测温精度高三个方面的优势。目前,国内疫情已基本得到控制,为防止疫情再次大规模爆发,大部分公共场所及企业办公楼的体温检测、戴口罩、消毒等防控措施开始趋向常态化管理。无接触、无人值守、快速感应的人脸识别测温设备在疫情期间得到...

    livem 评论0 收藏0
  • 2021电赛F题送药小车视觉部分一种思路(双OpenMV法)

    摘要:总体流程如下代码实现透视校正用的四个点识别数字的五个区域反相后红色阈值各区域识别数字准确度门槛拍照并进行一堆预处理识别中心数字识别左起第一个数字识别左起第二个数字识别左起第三个数字 ...

    acrazing 评论0 收藏0
  • 2021全国大学生电子设计竞赛F题参赛简记

    摘要:而深度学习的手写数字识别去年被官方下架了。。。深度学习方法改成旧版本,用自己的深度学习。神经网络训练树莓派之前做过这个,还比较有底,但是要自己标千多张数据集。 20...

    geekzhou 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<