项目实训(五)--- 对上传图片进行人脸判断

2021SC@SDUSC

这部分是与前端同学商量,需要对用户上传的人脸图片进行一个预先判断,即判断用户上传的是否是人脸照片,如果不是则让用户重新上传,如果是人脸照片,则进行后续的算法操作。

这部分代码是使用python的opencv进行实现的,因为我们的后端是使用java语言编写的,因此这部分代码要在java中进行一个调用。我们先来看这部分python代码对于功能的实现。

目录

一.代码实现

 二.测试效果


一.代码实现

首先引入需要的库:

# 人脸检测
import cv2
import imageio
import numpy as np

opencv人脸识别分类器:

face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_alt.xml')

上传人脸照片后端这里有一个逻辑判断就是先来检测一下上传的照片是否是人脸,以及人脸是否符合规范,例如五官都存在,如果不满足,则让客户端重传,满足的话才执行下面的算法。

人脸检测代码

这部分代码我使用的是Opencv中的一个级联分类器对人脸照片识别。

CascadeClassifier,是Opencv中做人脸检测的时候的一个级联分类器。并且既可以使用Haar,也可以使用LBP特征。

项目实训(五)--- 对上传图片进行人脸判断_第1张图片

项目实训(五)--- 对上传图片进行人脸判断_第2张图片 

 

Haar特征是一种反映图像的灰度变化的,像素分模块求差值的一种特征。它分为三类:边缘特征、线性特征、中心特征和对角线特征。用黑白两种矩形框组合成特征模板,在特征模板内用 黑色矩形像素和 减去 白色矩形像素和来表示这个模版的特征值。

例如:脸部的一些特征能由矩形模块差值特征简单的描述,如:眼睛要比脸颊颜色要深,鼻梁两侧比鼻梁颜色要深,嘴巴比周围颜色要深等。但矩形特征只对一些简单的图形结构,如边缘、线段较敏感,所以只能描述在特定方向(水平、垂直、对角)上有明显像素模块梯度变化的图像结构。这样就可以进行区分人脸。

读入图片

def readImg(path):
 img = cv2.imread(path)
 if img is None:
  tmp = imageio.mimread(path)
  if tmp is not None:
   tmp = np.array(tmp)
   img = tmp[0][:, :, :3]
 return img

进行判断:

img=readImg(path)

face = face_cascade.detectMultiScale(img,1.1,4)

if face != () :

 for (x, y, w, h) in face:
   cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)

 cv2.imwrite("%s_face_detected.jpg"%(path), img)

 print('成功检测到人脸!')

else:

 print('未检测到人脸!')

这部分的代码结构如下:

项目实训(五)--- 对上传图片进行人脸判断_第3张图片

 二.测试效果

输入图片:

图片人脸不全,若用户输入类似图片,则直接拒绝,重新上传。

项目实训(五)--- 对上传图片进行人脸判断_第4张图片

结果:

项目实训(五)--- 对上传图片进行人脸判断_第5张图片

输入图片:

项目实训(五)--- 对上传图片进行人脸判断_第6张图片

结果:

成功检测到人脸,保存框选出来的图片到当前目录。

项目实训(五)--- 对上传图片进行人脸判断_第7张图片

 项目实训(五)--- 对上传图片进行人脸判断_第8张图片

项目实训(五)--- 对上传图片进行人脸判断_第9张图片

(本次记录的图片均来自网络,侵删)

你可能感兴趣的:(python,opencv,目标检测)