tfidfnumpy算余弦相似度_Python-OpenCV 干货 人脸辨识1、余弦相似度

一、目的

通过某人的一张照片,在他与别人的合影中找到他。

1.算法描述

  • 读取两张图像,生成图像矩阵,以两个图像矩阵为基础,调用OpenCV的相关函数完成人脸定位。
  • 读取两张图像的人脸区域,生成人脸图像矩阵,并将人脸矩阵转换为灰度图
  • 比较分析人脸图像矩阵,找到最相近的人脸。

2.比较算法使用欧氏距离算法

在进行人脸识别是,可使用标准欧氏距离算法。算法基本原理是:

  • 将标准欧氏距离算法作为比较分析人脸图像矩阵方法。
  • 首先,将两个人脸调整为指定大小;
  • 接着,用所包含像素的三元色数值组成特征组,然后将特征组映射为高维空间的某个点(在此称之为特征点);
  • 最后,计算两个人脸图像的特征点映射到高维空间后的距离,以欧氏距离最小者为最匹配的人脸。

二、代码

下面代码需要OPENCV的data库,在代码中需要指向opencv的data位置。

git clone https://github.com/opencv/opencv
# -*- coding: utf-8 -*-# code:# 11-2.py# 标准欧氏距离实现的人脸识别import cv2import numpy as npprint('loding...')OPCV_PATH = r"D:/tools/opencv/sources/data/haarcascades"def get_EuclideanDistance(x, y): myx = np.array(x) myy = np.array(y) return np.sqrt(np.sum((myx - myy) * (myx - myy))) * np.var(myx - myy)def get_distance(img, findimg): newsize = (img.shape[1], img.shape[0]) fimg = cv2.resize(findimg, newsize) my_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # my_fimg=cv2.cvtColor(fimg,cv2.COLORBGR2GRAY) my_fimg = cv2.cvtColor(fimg, cv2.COLOR_BGR2GRAY) return get_EuclideanDistance(my_img, my_fimg)color = (0, 0, 0) # 设置人脸框的颜色def findface(src, index): image = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY) cv2.equalizeHist(image, image) # 灰度图像进行直方图等距化 # 加载OpenCv的面部特征库 classfier = cv2.CascadeClassifier(OPCV_PATH + "/haarcascade_frontalface_alt.xml") # 找到人脸的位置 # 设定最小图像的大小 divisor = 8 h = image.shape[1] w = image.shape[0] minSize = (int(w / divisor), int(h / divisor)) # 这里加了一个取整函数 rect = classfier.detectMultiScale(image, 1.2, 2, cv2.CASCADE_SCALE_IMAGE, minSize) if len(rect) > 0: # 如果人脸数组长度大于0 for faceRect in rect: # 对每一个人脸画矩形框 x, y, w, h = faceRect cv2.rectangle(image, (x, y), (x + w, y + h), color) cv2.imshow('img' + str(index), image) result = [] for r in rect: result.append([(r[0], r[1]), (r[0] + r[2], r[1] + r[3])]) print(result) return resultsearch_file = 'search.jpg'origin_file = 'origin.jpg'origin_img = cv2.imread(origin_file)search_img = cv2.imread(search_file)# 获取人脸在图像中的坐标origin_result = findface(origin_img, 1)[0]origin_img_crop = origin_img[origin_result[0][1]:origin_result[1][1], origin_result[0][0]:origin_result[1][0], :]cv2.rectangle(origin_img, origin_result[0], origin_result[1], (255, 0, 255))search_result = findface(search_img, 2)# 比较第1张脸tmp = search_img[search_result[0][0][1]:search_result[0][1][1], search_result[0][0][0]:search_result[0][1][0], :]distance_face1 = get_distance(origin_img_crop, tmp)print('distance1 = %f' % distance_face1)cv2.imshow('1', tmp)# 比较第2张脸tmp = search_img[search_result[1][0][1]:search_result[1][1][1], search_result[1][0][0]:search_result[1][1][0], :]distance_face2 = get_distance(origin_img_crop, tmp)print('distance2 = %f' % distance_face2)cv2.imshow('2', tmp)if distance_face1 < distance_face2: cv2.rectangle(search_img, search_result[0][0], search_result[0][1], (255, 0, 255))else: cv2.rectangle(search_img, search_result[1][0], search_result[1][1], (255, 0, 255))cv2.imshow('search', search_img)cv2.imshow('origin', origin_img)cv2.waitKey()cv2.destroyAllWindows()

原始图片:

64f7bd1e6fefcae13427b649b4019d47.png


从下面的图中找到他:

385f2c3b11f7103f50f7de3c33c6f7cd.png

运行效果:

bb4480de5dd5a0497f385af32ce1c73f.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值