本周使用python语言实现了面部图像的正则化,代码分为3部分:负责正则化图像的normalizeImg函数,把头部旋转角度向量和旋转矩阵互相转换的rodrigues函数,以及调用前两者正则化图像的normalize_data函数
normallizeImg:
负责正则化图像的normalizeImg函数如下:
import numpy as np
import cv2 as cv
import rodrigues as rod
from numpy import *
def normalizeImg(inputImg, target_3D, hR, gc, roiSize, cameraMatrix, focal_new=960, distance_new=600):
distance=np.linalg.norm(target_3D)
z_scale=distance_new/distance
cam_new=np.array([[focal_new,0,roiSize[0]/2],[0.0,focal_new,roiSize[1]/2],[0,0,1.0]])
scaleMat=np.array([[1.0,0.0,0.0],[0.0,1.0,0.0],[0.0,0.0,z_scale]])
hRx=hR[:,0]
forward=target_3D/distance
forward=forward[:,0]
#print(forward.shape,hRx.shape)
down=np.cross(forward,hRx)
down=down/np.linalg.norm(down)
right = cross(down, forward);
right = right/np.linalg.norm(right);
rotMat=c_[right,down,forward].T
t1=np.dot(cam_new,scaleMat)
t2=np.dot(rotMat,np.linalg.inv(cameraMatrix))
warpMat=np.dot(t1,t2)
img_warped=cv.warpPerspective(inputImg,warpMat,roiSize,cv.INTER_LINEAR)
#rotation normalize
cnvMat=np.dot(scaleMat,rotMat)
hRnew=np.dot(cnvMat,hR)
hrnew=rod.rodrigues(hRnew)
htnew=np.dot(cnvMat,target_3D)
#gaze vector normalization
gcnew=np.dot(cnvMat,gc)
gvnew=gcnew-htnew
gvnew=gvnew/np.linalg.norm(gvnew)
return img_warped,hrnew,gvnew
其中使用了warpPerspective函数,是将成像投影到一个新的视平面的函数,即可以将摄像机以一定角度拍摄的人脸图像转化为平行于人脸拍摄的图像。效果如下:
rodrigues
rodrigues函数用于将旋转向量(31)和旋转矩阵(33)相互转换,代码如下:
import numpy as np
from numpy import *
e