复杂图像的区域分割与图形特征提取之人脸识别,有参考资料,仿真可运行,运行之前记得询问我怎么改程...

张开发
2026/4/4 18:45:53 15 分钟阅读
复杂图像的区域分割与图形特征提取之人脸识别,有参考资料,仿真可运行,运行之前记得询问我怎么改程...
复杂图像的区域分割与图形特征提取之人脸识别有参考资料仿真可运行运行之前记得询问我怎么改程序适应你的电脑刷手机人脸解锁、打卡机认脸签到这些日常操作背后其实藏着“复杂图像区域分割图形特征提取”的双料组合拳。今天就用两行代码加唠嗑的方式拆解人脸识别最接地气的两步。第一步从垃圾堆里抠出人脸——区域分割假设你手里有张聚会大合照背景是餐厅吊灯、绿植十几个人挤在一起怎么精准把每个人的人脸揪出来先上OpenCV的快速实现import cv2 face_cascade cv2.CascadeClassifier(cv2.data.haarcascades haarcascade_frontalface_default.xml) # 读取复杂背景的测试图 img cv2.imread(party_photo.jpg) gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 转灰度图分类器爱吃灰度图 # 检测人脸scaleFactor是每次缩放比例minNeighbors是候选框需要多少个邻居才认定为人脸 faces face_cascade.detectMultiScale(gray, scaleFactor1.1, minNeighbors5, minSize(30, 30)) # 把检测到的人脸框出来顺便分割保存 for (x, y, w, h) in faces: cv2.rectangle(img, (x, y), (xw, yh), (0, 255, 0), 2) # 画绿色框 # 分割人脸区域——这一步就是从复杂图像里把目标抠出来 face_roi img[y:yh, x:xw] cv2.imwrite(fdetected_face_{x}.jpg, face_roi) # 展示结果 cv2.imshow(Face Detection, img) cv2.waitKey(0) cv2.destroyAllWindows()唠两句代码逻辑这个Haar分类器就像个靠经验吃饭的老刑警提前看了几百万张人脸图记住了“眼睛比脸颊暗、鼻梁比两边亮”这类规律。detectMultiScale就是让它扫一遍图把符合规律的区域框出来。要是你用的图背景特别乱比如人脸后面有个白盘子Haar可能把盘子当人脸调大minNeighbors参数到7就能过滤掉误检的框——简单说就是“要求这个候选框周围得有更多‘同伙’证明它是人脸才给通过”。第二步给人脸办个数字身份证——特征提取分割出人脸还不够得把这张脸转成机器能懂的“特征码”不然下次换个角度拍同一个人机器认不出来。这里用LBPH局部二值模式直方图OpenCV也有现成的工具import cv2 import os import numpy as np # 先复用之前加载的face_cascade省得重复写 # 准备训练数据把你要识别的人脸照片放一个文件夹文件夹名就是人名 def prepare_training_data(data_folder_path): dirs os.listdir(data_folder_path) faces [] labels [] label_dict {} current_label 0 for dir_name in dirs: if not os.path.isdir(os.path.join(data_folder_path, dir_name)): continue label_dict[current_label] dir_name subject_dir_path os.path.join(data_folder_path, dir_name) subject_images_names os.listdir(subject_dir_path) for image_name in subject_images_names: if image_name.startswith(.): continue image_path os.path.join(subject_dir_path, image_name) image cv2.imread(image_path, cv2.IMREAD_GRAYSCALE) # 先检测人脸确保只训练人脸区域 faces_rects face_cascade.detectMultiScale(image, scaleFactor1.1, minNeighbors5) for (x, y, w, h) in faces_rects: face image[y:yh, x:xw] faces.append(face) labels.append(current_label) current_label 1 return faces, labels, label_dict # 训练LBPH识别器 face_recognizer cv2.face.LBPHFaceRecognizer_create() faces, labels, label_dict prepare_training_data(training_faces) face_recognizer.train(faces, np.array(labels)) # 测试识别 def predict(test_image_path): test_image cv2.imread(test_image_path, cv2.IMREAD_GRAYSCALE) faces_rects face_cascade.detectMultiScale(test_image, scaleFactor1.1, minNeighbors5) for (x, y, w, h) in faces_rects: face test_image[y:yh, x:xw] label, confidence face_recognizer.predict(face) # 置信度越低匹配度越高0就是完全一样 predicted_name label_dict[label] cv2.putText(test_image, predicted_name f ({confidence:.0f}), (x, y-5), cv2.FONT_HERSHEY_PLAIN, 1.5, (0, 255, 0), 2) cv2.rectangle(test_image, (x, y), (xw, yh), (0, 255, 0), 2) return test_image # 运行测试 predicted_img predict(test_photo.jpg) cv2.imshow(Face Recognition, predicted_img) cv2.waitKey(0) cv2.destroyAllWindows()这段代码的核心是LBPH把人脸切成无数个16x16的小方块每个方块里拿中心像素当裁判周围255个像素比它亮就记1暗就记0最后把这256个01串统计成直方图——每个小方块的直方图拼起来就是这张脸的“数字指纹”。训练的时候机器把每个人的“指纹”存起来测试的时候拿新人脸的“指纹”去比对置信度低于50基本就能认对人。当然复杂图像比如逆光、戴口罩的情况LBPH可能歇菜——毕竟它认的是人脸的纹理细节口罩挡了半张脸纹理少了一半自然难认。这时候就得换深度学习的方法比如FaceNet或者ArcFace但入门先把传统方法玩明白再往上跳更稳。复杂图像的区域分割与图形特征提取之人脸识别有参考资料仿真可运行运行之前记得询问我怎么改程序适应你的电脑最后划重点运行之前一定要喊我我会根据你的OpenCV版本比如是3.x还是4.x、本地图片/文件夹路径、甚至电脑系统告诉你怎么改代码里的分类器路径、训练数据路径调参数避开坑——硬跑的话要么找不到文件要么分类器加载失败得不偿失哈。其实人脸识别没那么神秘本质就是“先把目标从杂波里抠出来再把目标转成机器能比对比对的特征”——从抠脸到做“数字身份证”两步走就搞定入门级的人脸识别啦

更多文章