前言
感谢正点原子和电子发烧友论坛提供的这次机会让我有机会体验这款正点原子STM32MP257开发板,希望可以借这个机会好好学习一下。
项目实现
项目通过识别我需要当成非陌生人的人脸,再使用LBPH人脸识别器(cv2.face.LBPHFaceRecognizer_create())训练为临时模型使用。剩下就是吧LBPH人脸识别器用作模型识别是否为陌生人,再通过蜂鸣器警报。
代码
import cv2
import numpy as np
import gpiod
import time
recognizer = cv2.face.LBPHFaceRecognizer_create()
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades+'haarcascade_frontalface_default.xml')
LINE = 13
with gpiod.request_lines(
"/dev/gpiochip5",
consumer="beep-example",
config={
LINE: gpiod.LineSettings(
direction=gpiod.line.Direction.OUTPUT, output_value=gpiod.line.Value.INACTIVE
)
},
) as request:
def get_reference_image_features(reference_image_path):
img = cv2.imread(reference_image_path)
if img is None:
print(f"Error: 无法加载参考图片 {reference_image_path}")
return None
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
if len(faces) == 0:
print("Error: 参考图片中未检测到人脸")
return None
(x, y, w, h) = faces[0]
face_roi = gray[y:y+h, x:x+w]
return face_roi
def train_recognizer_with_reference(reference_image_path):
reference_features = get_reference_image_features(reference_image_path)
if reference_features is None:
return False
labels = np.array([0])
recognizer.train([reference_features], labels)
return True
def real_time_recognition(reference_image_path):
if not train_recognizer_with_reference(reference_image_path):
print("Error: 人脸识别器训练失败")
return
cap = cv2.VideoCapture(7)
stranger_detected = False
while True:
ret, frame = cap.read()
if not ret:
print("Error: 无法读取摄像头帧")
break
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
current_stranger_status = False
for (x, y, w, h) in faces:
face_roi = gray[y:y+h, x:x+w]
label, confidence = recognizer.predict(face_roi)
if confidence > 85:
cv2.putText(frame, "Stranger", (x, y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 0, 255), 2)
cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 0, 255), 2)
current_stranger_status = True
else:
cv2.putText(frame, "Known Person", (x, y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)
cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)
cv2.imshow('Real-Time Recognition', frame)
if current_stranger_status and not stranger_detected:
stranger_detected = True
elif not current_stranger_status and stranger_detected:
stranger_detected = False
if stranger_detected:
request.set_value(LINE, gpiod.line.Value.ACTIVE)
time.sleep(1)
request.set_value(LINE, gpiod.line.Value.INACTIVE)
time.sleep(1)
else:
request.set_value(LINE, gpiod.line.Value.INACTIVE)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
if __name__ == "__main__":
reference_image_path = "reference_image.jpg"
real_time_recognition(reference_image_path)
效果:在底部
总结
STM32MP257是一个很不错的芯片,在AI方面表现突出,再与正点原子合作,将STM32MP257的外设添加,让其的能力能发挥出来。