查找多照片中包含指定人脸的所有照片

  • 目标场景
  • 目标任务
    • 人脸检测
      • 文件结构
      • 代码详情
    • 人脸相似度计算

目标场景

日常生活中,我们会拍下很多的瞬间,其中可能有一个人或多个人,当我们在看到某一张照片中的某一个人的时候,我们可能会想看本相册中包含这个人的所有照片。

目标任务

1. **人脸检测:**给定包含人脸的图像,找出其中的所有人脸并保存,用于选择目标人脸;
2. **人脸相似度计算:**根据目标人脸,在给定多个图像中逐张判断该人脸是否存在。

人脸检测

文件结构

代码详情

# _*_ coding:utf-8 _*_import numpy as np
import cv2
import dlib
import os
import mathface_cascade = cv2.CascadeClassifier('haarcascade_frontalface_alt2.xml')
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')def euclidean_distance(p1_list, p2_list):"""欧式距离:计算两点[x1,y1]之间的欧式距离"""ed = math.sqrt((p1_list[0] - p2_list[0]) ** 2 + (p1_list[1] - p2_list[1]) ** 2)return eddef get_filename(file_path):"""通过绝对路径或相对路径获取文件名称"""for i in range(len(file_path)):if file_path[-i] == '\\' or file_path[-i] == '/':filename = file_path[-i + 1:]breakelse:filename = file_pathreturn filenamedef get_face_68_features(img_path, out_dir):"""通过68个特征点获取人脸图像并保存"""img_name = get_filename(img_path)  # 获取文件名称img = cv2.imread(img_path)  # cv2读取图像img_gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)  # 取灰度rects = detector(img_gray, 1)  # 人脸数rectsfor i in range(len(rects)):landmarks = np.matrix([[p.x, p.y] for p in predictor(img, rects[i]).parts()])print(img_name + "_" + str(i) + '.jpg', '\tlandmarks:', type(landmarks), landmarks.shape)# 保存当前脸部图像p8 = [landmarks[8, 0], landmarks[8, 1]]p0 = [landmarks[0, 0], landmarks[0, 1]]p16 = [landmarks[16, 0], landmarks[16, 1]]p27 = [landmarks[27, 0], landmarks[27, 1]]p29 = [landmarks[29, 0], landmarks[29, 1]]radius = round(3 / 7 * (euclidean_distance(p8, p0) + euclidean_distance(p8, p16)))  # 半径delta_x = round((p27[0] - p0[0]) - (1 / 2 * (p16[0] - p0[0])))center = [p29[0] - delta_x, p29[1]]left = center[0] - radiustop = center[1] - radiusright = center[0] + radiusbottom = center[1] + radiusface = img[int(top):int(bottom), int(left):int(right)]print(int(top), int(bottom), int(left), int(right))print(out_dir + '/' + img_name + "_" + str(i) + '_.jpg')cv2.imwrite(out_dir + '/' + img_name + "_" + str(i) + '_.jpg', face)print('\t OK!')for idx, point in enumerate(landmarks):  # 将68个特征点画在图像上# 68点的坐标pos = (point[0, 0], point[0, 1])# print(idx, pos)# 利用cv2.circle给每个特征点画一个圈,共68个cv2.circle(img, pos, 1, color=(0, 255, 0))# 利用cv2.putText输出1-68font = cv2.FONT_HERSHEY_SIMPLEXcv2.putText(img, str(idx), pos, font, 0.2, (0, 0, 255), 1, cv2.LINE_AA)cv2.namedWindow("img")cv2.imshow("img", img)cv2.waitKey(2000)if __name__ == '__main__':faces_dir = 'image/'out_dir = 'faces/'faces_rpath = os.listdir(faces_dir)for i in range(len(faces_rpath)):faces_rpath[i] = os.path.join(faces_dir, faces_rpath[i])get_face_68_features(faces_rpath[i], out_dir)

人脸相似度计算

相似度计算关键代码:

def compare2face(img1, img2):face1 = encoding_face(img1)face2 = encoding_face(img2)if face1 and face2:dist = np.sqrt(np.sum(np.square(np.subtract(face1[0]['embedding'], face2[0]['embedding']))))return distreturn -1

查找多照片中包含指定人脸的所有照片相关推荐

  1. VB快速查找大型文件中包含的字符串

    关于查找大型文件中包含的字符串,一般都把文件内容读入到内存,然后在内存里进行比较,却不知这种办法有一个致命的弱点,那就是由于大量的内存申请和释放导致的内存颠簸,会使系统性能下降,严重影响了查找的速度. ...

  2. Python查找文件夹中含有指定关键字的文件

    查找文件夹中含有指定关键字的文件,并将该文件复制到另一个文件夹中 ''' 查找文件夹中含有指定关键字的文件,并将该文件复制到另一个文件夹中 ''' import os import shutildef ...

  3. Excel 查找某一列中包含指定字符的单元格

    网上查找相关内容,个人感觉是另一种形式的过滤喽.有的说用FIND,有的用高级筛选.我查找时如下: 1.新拉一列,标注公式"=ISNUMBER(FIND("宣",B2))& ...

  4. php从照片中抠出人脸,PS怎样将一张图片上的人脸抠取五官下来到另一张图片

    怎么样用Photoshop把一张图片上的脸抠取五官下来到另一张图片?就是用Photoshop像下面图片一样抠取五官到另一张图片上 但是只要五官 然后肤色还是要黄色的. 主要过程: 1. 把皮卡丘的五官 ...

  5. 若查找课程表中课程名称是计算机或英语,在课程表中要查找课程名称中包含计算机的课程,对应课程名称字段的正确条件表达式是______。...

    [判断题]搜索引擎的用户接口供用户输入查询要求并显示结果. [多选题]控制共聚物组成的方法有( )等. [单选题]分离外周血单个核细胞常用的分层液是 [单选题]产品结构就是以( ) 来实现产品各功能单 ...

  6. python查找文件夹中的指定文件_python 递归搜索文件夹下的指定文件

    python 递归搜索文件夹下的指定文件 import os def look_in_directory(directory): """Loop through the ...

  7. linux带字符的行,linux小计,统计文件中包含指定字符串的行数

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 Linux, the kernel developed and distributed by Linus Torvalds et al, contains ...

  8. SQL 查询数据库中包含指定字符串的相关表和相关记录

    declare @str varchar(100) set @str='我要找的' --要搜索的字符串 declare @s varchar(8000) declare tb cursor local ...

  9. linux统计一个文本文件包含多少行,linux小计,统计文件中包含指定字符串的行数...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 Linux, the kernel developed and distributed by Linus Torvalds et al, contains ...

最新文章

  1. 从基于网络的安装服务器安装操作系统,PXE 概述 - Sun Fire X4800 服务器安装指南(适用于 Linux 操作系统)...
  2. Windows与Linux拷贝数据
  3. python绘制三维散点图-Python散点图与三维图
  4. Hyperopt 入门指南
  5. 维护库存地点的装运点确认
  6. ERP实施中要重视物料编码的规则
  7. java nio.Buffer的属性变化
  8. python2和python3的主要区别
  9. 【软件】我安装Tomcat5.5(Java Web开发服务器)的几点经验
  10. Eureka-提供者与消费者
  11. 一文总结 CPU 基本知识
  12. PyQt5入门——QListWidget实现图片缩略图列表
  13. python wget 卡住_python – Paramiko在执行大型wget命令时挂起
  14. Madagascar中的宏定义函数--绝对值函数和符号函数
  15. python之列表操作
  16. WindJS 中的$await
  17. 你不能访问此共享文件夹,因为你组织的安全策略阻止未经身份验证的来宾访问
  18. php扩展引擎手册,模板引擎-THINKPHP 5.0 手册最新版
  19. 【PTA】【Python】【拼题A 2022 跨年挑战赛】投票
  20. JS中国标准时间格式转换

热门文章

  1. Final Cut Pro中文新手教程 (八) 如何导出视频「下」
  2. ROS机器人操作系统——创建工作空间与功能包(四)
  3. QT之“蛛网图”自绘控件
  4. ECU 自动化生产测试系统
  5. img = d2l.Image.open(‘../img/cat1.jpg‘) 路径错误问题
  6. Discuz!手机版被百度强制转码且移动落地页检测检测为正文穿插广告或广告面积太大
  7. Sublime Text 2 - 性感无比的代码编辑器!程序员必备神器!跨平台支持Win/Mac/Linux
  8. 基于贝叶斯估计的星级得分排名
  9. 大学计算机作业查重,大学生课程作业进行查重?别把“水论文”之过都抛给学生!...
  10. Dell开机时报错smartaudio无法运行