void Optimizer::FitSegments(mat& alpha, mat& beta, mat& rho, mat& lamda, InputPtr input, ModelPtr model, MeshPtr mesh, ShapePtr shape, TexturePtr texture) { mat eye_alpha = alpha; mat eye_beta = beta; mat nose_alpha = alpha; mat nose_beta = beta; mat mouth_alpha = alpha; mat mouth_beta = beta; mat rest_alpha = alpha; mat rest_beta = beta; Face3dModel face3d_model(shape, texture); mesh = face3d_model.Construction(alpha, beta); TwoPassZbuffer(rho, lamda, mesh, model, true); // cal segment two pass z-buffer for (int c = 0; c < 3; ++c) { model->EnableIterator(ModelImage::NOSE); FitNose(nose_alpha, nose_beta, rho, lamda, input, model, mesh, shape, texture); model->EnableIterator(ModelImage::EYE); FitEye(eye_alpha, eye_beta, rho, lamda, input, model, mesh, shape, texture); model->EnableIterator(ModelImage::MOUTH); FitMouth(mouth_alpha, mouth_beta, rho, lamda, input, model, mesh, shape, texture); model->EnableIterator(ModelImage::REST); FitRest(rest_alpha, rest_beta, rho, lamda, input, model, mesh, shape, texture); } mat all_alpha(PrincipalNum,SegmentsNum); all_alpha.cols(0, 0) = nose_alpha; all_alpha.cols(1, 1) = eye_alpha; all_alpha.cols(2, 2) = mouth_alpha; all_alpha.cols(3, 3) = rest_alpha; mat all_beta(PrincipalNum, SegmentsNum); all_beta.cols(0, 0) = nose_beta; all_beta.cols(1, 1) = eye_beta; all_beta.cols(2, 2) = mouth_beta; all_beta.cols(3, 3) = rest_beta; mesh = face3d_model.Construction(all_alpha, all_beta); mesh->Blend(); rho.quiet_save("rho_para", arma_binary); lamda.quiet_save("lamda_para", arma_binary); }