人脸识别过程中,人脸对齐往往是最重要的一步,对齐的结果往往影响之后提取人脸特征的准确率,opencv内置的仿射变换仅仅需要三个点,而需对齐的人脸关键点一般是5个、68个、128个,本文提供一种n点对齐的放射变换点,以5个关键点的对齐为例:
归一化的五点坐标为:

[(0.31556875000000000, 0.4615741071428571),(0.68262291666666670, 0.4615741071428571),(0.50026249999999990, 0.6405053571428571),(0.34947187500000004, 0.8246919642857142),(0.65343645833333330, 0.8246919642857142)]

假如要裁剪的face大小为(112, 96),即:(height, width),则face的最终location点为:(xwidth, yheight)

[(30.2946, 51.6963),(65.5318, 51.6963),(48.0252, 71.7366),(33.5493, 92.3655),(62.7299, 92.3655)]

代码参考来源:https://matthewearl.github.io/2015/07/28/switching-eds-with-python/

#coding=utf-8
import os,cv2,numpy
import logging
logging.basicConfig(level=logging.DEBUG,format='%(asctime)s %(levelname)s: %(message)s',datefmt='%Y-%m-%d %H:%M:%S'
)
logger = logging.getLogger(__name__)imgSize = [112, 96];
coord5point = [[30.2946, 51.6963],[65.5318, 51.6963],[48.0252, 71.7366],[33.5493, 92.3655],[62.7299, 92.3655]]face_landmarks = [[259, 137],[319, 150],[284, 177],[253, 206],[297, 216]]def transformation_from_points(points1, points2):points1 = points1.astype(numpy.float64)points2 = points2.astype(numpy.float64)c1 = numpy.mean(points1, axis=0)c2 = numpy.mean(points2, axis=0)points1 -= c1points2 -= c2s1 = numpy.std(points1)s2 = numpy.std(points2)points1 /= s1points2 /= s2U, S, Vt = numpy.linalg.svd(points1.T * points2)R = (U * Vt).Treturn numpy.vstack([numpy.hstack(((s2 / s1) * R,c2.T - (s2 / s1) * R * c1.T)),numpy.matrix([0., 0., 1.])])def warp_im(img_im, orgi_landmarks,tar_landmarks):pts1 = numpy.float64(numpy.matrix([[point[0], point[1]] for point in orgi_landmarks]))pts2 = numpy.float64(numpy.matrix([[point[0], point[1]] for point in tar_landmarks]))M = transformation_from_points(pts1, pts2)dst = cv2.warpAffine(img_im, M[:2], (img_im.shape[1], img_im.shape[0]))return dstdef main():pic_path = r'D:\20171117190537959.jpg'img_im = cv2.imread(pic_path)cv2.imshow('affine_img_im', img_im)dst = warp_im(img_im, face_landmarks, coord5point)cv2.imshow('affine', dst)crop_im = dst[0:imgSize[0], 0:imgSize[1]]cv2.imshow('affine_crop_im', crop_im)if __name__=='__main__':main()cv2.waitKey()pass



cv2最强仿射变换(支持n点对齐,可进行人脸对齐)相关推荐

  1. 人脸对齐之SDM / 人脸对齐之LBF / 人脸实时替换

    人脸对齐之SDM(Supervised Descent Method) 人脸对齐之LBF(Local Binary Features) 人脸识别技术大总结(1):Face Detection & ...

  2. 【人脸对齐-Landmarks】人脸对齐算法常用评价标准

    1 the inter-ocular distance normalized error 其中 xix_ixi​ 表示预测坐标点,表示ground-truth,dIODd_{IOD}dIOD​ 表示两 ...

  3. Openface(二):实现人脸对齐

    最近学习了开源代码Openface,实现了LFW数据集的人脸对齐.这些人脸对齐的图片是后续深度学习神经网络的训练数据集. 代码除了引用常见的python包,还引用了两个本地包:一个是dataset,用 ...

  4. 人脸对齐(二十)--PRN

    Joint3D Face Reconstruction and Dense Alignment with Position Map Regression(PRN2018) 我们从之前的论文可以看出,基 ...

  5. coreldraw 导入面料_CDR真强!支持导入的文件格式这么多

    原标题:CDR真强!支持导入的文件格式这么多 CorelDRAW作为世界一流的平面矢量绘图软件,被专业设计人员广泛使用,作为强大的图形设计工具包含对超过 100 种常用文件格式的广泛文件兼容性支持,它 ...

  6. 通用网络验证系统,承载能力强,支持高并发、高承载、多线路

    这个网络验证系统基于Php+MySql数据库架构的网络验证系统,安全稳定.性能强悍. 承载能力强,支持高并发.高承载.多线路,支持服务器集群架设,高性能设计,速度非常快,效率非常高. 客户端支持VC. ...

  7. opencv中mean函数耗时_使用OpenCV进行人脸对齐

    在人脸识别项目中,如果图片中人脸的方向各不一样且相差很大,这样会影响人脸识别的准确率.所以在实际人脸检测项目中,在人脸识别的前一步往往会先进行人脸对齐.人脸对齐可以看作是数据normalization ...

  8. 人脸系列:人脸检测、人脸关键点定位、人脸优选、人脸对齐、人脸特征提取、人脸跟踪、人脸活体检测

    一.一点想法 缘由:最近想整理下从事人脸方向的所有查阅过的论文,做过的相关实验,因为随着时间的推移,自己总会遗忘当初的一些想法,所以想好好整理下自己的学习笔记. 过程:本系列包括从人脸检测.人脸关键点 ...

  9. dlib人脸对齐(python)

    1 68 和 51 关键点 2 人脸对齐 a 定位图片中的人脸 b 提取人脸区域的图片并保存 c 人脸对齐操作并保存 3 代码 import dlib import face_recognition ...

最新文章

  1. ireport如何给static text加边框_html amp;amp; css 解决li浮动边框为2的问题
  2. 算法基础知识科普:8大搜索算法之红黑树(中)
  3. (原)Apache添加完限速模块后的文件
  4. JavaScript/VBScript脚本程序调试(Wscript篇)
  5. 函数_方法_的四种调用方式
  6. 2019年9月中国编程语言排行榜,C#排第三
  7. 安装telnet_Flask干货:Memcached缓存系统——Memcached的安装
  8. 深入理解JavaScript系列:This? Yes,this!
  9. [翻译]超炫列表动画的实现
  10. Idea修改字体颜色
  11. mysql单表大小限制
  12. DVWA 黑客攻防演练(十二) DOM型 XSS 攻击 DOM Based Cross Site Scripting
  13. 解决 fatal: unable to access xxx: Encountered end of
  14. 你还在使用xshell绿色破解版?
  15. Java的日期类说明Calendar、Data、日期转化格式化以及注意事项
  16. 【资源帖】深度学习视觉领域常用数据集汇总
  17. [转载]2012 年 4 月,水王排行榜
  18. PADS-VX入门到精通实战项目讲解(上)—LOGIC部分-覃小刚-专题视频课程
  19. Ceilometer原理及介绍
  20. HashMap和Iterator迭代器的小用法

热门文章

  1. inieditor操作conf、ini文件新思路
  2. 基础知识 -- 问答
  3. vue 路由动态改变redirect值
  4. Python + itchat 实现微信机器人聊天(支持自动回复指定群聊)
  5. 如何从HITRAN数据库 获取数据
  6. Linux THP分析
  7. 解决页面变小字体却不变问题
  8. 快递物流单号查询api接口PHP快递鸟对接案例
  9. 编写代码的软件用什么编写的_当编写过多的代码可能会杀死您
  10. jeesite 登录模块