- 作品要求:
- 一、作品设计与模块选择
- 1.可以感应人脸
- 2.感应到人脸时开启显示屏显示
- 3.显示温度、速度等
人脸识别模块选用openmv模块,因为opencv用起来相对复杂。
用官方人脸识别示例代码进行修改,得出以下代码:
获取照片:
像素点是92,112的,并且是灰度图,pgm格式,存在singtown中,然后在singtown文件夹中再新建n个名为s1,s2,s3…sn的子文件夹,其中n为整个图像库中的人数。
#快照示例
#
#注意:你需要一个SD卡来运行这个例子。
#
#你可以使用你的OpenMV摄像机来保存图像文件。
import sensor, image, pyb
RED_LED_PIN = 1
BLUE_LED_PIN = 3
sensor.reset() # Initialize the camera sensor.
sensor.set_pixformat(sensor.GRAYSCALE) # or sensor.GRAYSCALE
sensor.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人脸识别代码:
#使用LBP描述符进行人脸识别。
#查看Timo Ahonen的“基于局部二进制模式的人脸识别”。
#在运行示例之前:
# 1)下载AT&T面对数据库http://www.cl.cam.ac.uk/Research/DTG/attarchive/pub/data/att_faces.zip
# 2)提取并复制orl_faces目录到SD卡根目录。
import sensor, time, image, pyb
from pyb import UART #添加串口
sensor.reset() # Initialize the camera sensor.
sensor.set_pixformat(sensor.GRAYSCALE) # or sensor.GRAYSCALE
sensor.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) #等待5s
uart = UART(3, 115200)
#SUB = "s1"
NUM_SUBJECTS = 6 #图像库中不同人数,一共6人
NUM_SUBJECTS_IMGS = 20 #每人有20张样本图片
# 拍摄当前人脸。
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
def min(pmin, a, s):
global num
if a
2.感应到人脸时开启显示屏显示
#include
#include
#include
#include
#define SCREEN_WIDTH 128 // OLED显示宽度,以像素为单位
#define SCREEN_HEIGHT 64 // OLED显示高度,以像素为单位
//连接到I2C的SSD1306显示器声明(SDA, SCL引脚)
#define OLED_RESET 4 // 复位引脚#(如果共享Arduino复位引脚,则为-1)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
volatile int flag;
String shuju;
void serialEvent() {
while (Serial.available() > 0) {
shuju = shuju + char(Serial.read());
delay(2);
flag = 1;
}
if (flag == 1) {
Serial.println(shuju);
shuju = "";
flag = 0;
}
}
void uart_dispose() {
if(shuju=="2")
{
display.print("A");
display.display();
}
}
void setup(){
flag = 0;
shuju = "0";
Serial.begin(9600);
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,0);
display.display(); // actually display all of the above
}
void loop(){
}
3.显示温度、速度等 


