def jacobian(self, params, x, y):
s = params[0]
r = params[1:4]
t = params[4:6]
w = params[6:]
mean3DShape = x[0]
blendshapes = x[1]
R = cv2.Rodrigues(r)[0]
P = R[:2]
shape3D = mean3DShape + np.sum(w[:, np.newaxis, np.newaxis] * blendshapes, axis=0)
nPoints = mean3DShape.shape[1]
#nSamples * 2 poniewaz kazdy punkt ma dwa wymiary (x i y)
jacobian = np.zeros((nPoints * 2, self.nParams))
jacobian[:, 0] = np.dot(P, shape3D).flatten()
stepSize = 10e-4
step = np.zeros(self.nParams)
step[1] = stepSize;
jacobian[:, 1] = ((self.fun(x, params + step) - self.fun(x, params)) / stepSize).flatten()
step = np.zeros(self.nParams)
step[2] = stepSize;
jacobian[:, 2] = ((self.fun(x, params + step) - self.fun(x, params)) / stepSize).flatten()
step = np.zeros(self.nParams)
step[3] = stepSize;
jacobian[:, 3] = ((self.fun(x, params + step) - self.fun(x, params)) / stepSize).flatten()
jacobian[:nPoints, 4] = 1
jacobian[nPoints:, 5] = 1
startIdx = self.nParams - self.nBlendshapes
for i in range(self.nBlendshapes):
jacobian[:, i + startIdx] = s * np.dot(P, blendshapes[i]).flatten()
return jacobian
#nie uzywane
评论列表
文章目录