Unterscheiden Sie verschiedene Gesichter
Video-Tutorial 19 – Verschiedene Gesichter unterscheiden: https://singtown.com/learn/50033/
In diesem Abschnitt erfahren Sie, wie Sie LBP-Funktionen verwenden, um verschiedene Gesichter zu unterscheiden.
Wir müssen zuerst unsere eigene Bildbibliothek erstellen. Wir erstellen zunächst einen neuen Ordner auf der OpenMV-U-Festplatte (beachten Sie, dass die SD-Karte eingelegt sein muss), nennen ihn singtown und erstellen dann n Unterordner mit den Namen s1, s2, s3 ... sn im singtown-Ordner, wobei n ist die Anzahl der Personen in der gesamten Bildbibliothek. Wie unten gezeigt:
Anschließend können wir den folgenden Code ausführen, um verschiedene Gesichtsproben zu sammeln. Achten Sie beim Sammeln darauf, dass der Hintergrund möglichst gleichmäßig ist und das Gesicht möglichst den gesamten Bildschirm ausfüllt. Das menschliche Gesicht kann lächeln, nicht lächeln, gerades Gesicht haben, geneigt sein, eine Brille tragen, keine Brille tragen usw. Pro Person können Sie 10-20 Bilder auswählen.
# Snapshot Example
#
# Note: You will need an SD card to run this example.
#
# You can use your OpenMV Cam to save image files.
import sensor, image, machine
#import 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):
#红灯亮
machine.LED("LED_RED").on()
#pyb.LED(RED_LED_PIN).on()
sensor.skip_frames(time = 3000) # Give the user time to get ready.等待3s,准备一下表情。
#红灯灭,蓝灯亮
machine.LED("LED_RED").off()
machine.LED("LED_BLUE").on()
#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()
machine.LED("LED_BLUE").off()
print("Done! Reset the camera to see the saved image.")
Nach der Aufnahme sieht das Bild auf dem OpenMV-USB-Flash-Laufwerk wie folgt aus (beachten Sie, dass OpenMV jedes Mal zurückgesetzt werden muss, wenn ein neues Bild/eine neue Datei auf das OpenMV-USB-Flash-Laufwerk geschrieben wird, bevor Sie es sehen können):
Abschließend führen wir den folgenden Code aus, um Gesichter im aktuellen Sichtfeld der Kamera zu identifizieren und die Person auszugeben, die am besten zum aktuellen Objekt passt.
# Face recognition with LBP descriptors.
# See Timo Ahonen's "Face Recognition with Local Binary Patterns".
#
# Before running the example:
# 1) Download the AT&T faces database http://www.cl.cam.ac.uk/Research/DTG/attarchive/pub/data/att_faces.zip
# 2) Exract and copy the orl_faces directory to the SD card root.
import sensor, time, image
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
#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<pmin:
pmin=a
num=s
return pmin
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为当前最匹配的人的编号。
Das laufende Ergebnis ist wie in der Abbildung dargestellt: