头文件 read.h

#ifndef READ_H_
#define READ_H_ class Read {
public:Read();void cal();double** get_vec();double* get_val();double* get_M();
};#endif

read.cpp

#include <iostream>
#include <fstream>
#include "Eigen/Dense"
#include "read.h"
using namespace std;
using namespace Eigen;
const int n = 11510 * 3, m = 150;
double **vec, *val, *M;Read::Read() {}void Read::cal() {double tp;ifstream in("D:\\hx\\data\\result.dat", ios::in | ios::binary);vec = (double**)new double*[n];for (int i = 0; i < n; i++) {*(vec + i) = new double[m];for (int j = 0; j < m; j++) {in.read((char*)& tp, sizeof(tp));vec[i][j] = tp;}}val = new double[m];for (int i = 0; i < m; i++) {in.read((char*)& tp, sizeof(tp));val[i] = tp;}M = new double[n];for (int i = 0; i < n; i++) {in.read((char*)& tp, sizeof(tp));M[i] = tp;}
}double** Read::get_vec() {return vec;
}double* Read::get_val() {return val;
}double* Read::get_M() {return M;
}

其他各个操作...

3dMM计算特征值特征向量存在二进制文件中,封装上面这个read类用来访问。read部分是测试读取,test部分是测试特征向量有没有设置对(随便取几组参数看看人脸形状)。

#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<fstream>
#include "Eigen/Dense"
#include <ctime>
#include <cstdio>
#include "read.h"
using namespace std;
using namespace Eigen;
const int n = 11510*3, m = 150;
MatrixXd X(n, m), C(m, m);
VectorXd M,A,B;
MatrixXd vec, val;
double** ans_vec;
double *ans_val, *ans_M;string s = "D:\\hx\\data\\FaceWarehouse_Data_0\\Tester_";
void featurenormalize(MatrixXd &X, VectorXd &M)
{//计算每一维度均值MatrixXd meanval = X.rowwise().mean();M = meanval; //VectorXd 就是列向量 RowVectorXd 是行向量//样本均值化为0X.colwise() -= M;
}
void computeCov(MatrixXd &X, MatrixXd &C)
{//计算协方差矩阵C = XTX / (m-1);C = X.adjoint() * X;C = C.array() / (m-1);
}
void computeEig(MatrixXd &C, MatrixXd &vec, MatrixXd &val)
{//计算特征值和特征向量,使用selfadjont按照对称矩阵的算法去计算,可以让产生的vec和val按照有序排列SelfAdjointEigenSolver<MatrixXd> eig(C);vec = eig.eigenvectors();val = eig.eigenvalues();
}int main()
{clock_t start, finish;start = clock();//读取数据for (int i = 1; i <= m; i++) {stringstream ss;ss << i;string num = ss.str();string file = s + num + "\\Blendshape\\shape_0.obj";ifstream in(file);string a;double x,y,z;int k = 0;while (!in.eof()) {in >> a;if (a[0] == 'v' && a.length()==1) {in >> x;X(k++, i - 1) = x;in >> y;X(k++, i - 1) = y;in >> z;X(k++, i - 1) = z;}}}//零均值化featurenormalize(X, M);//计算协方差computeCov(X, C);//计算特征值和特征向量computeEig(C, vec, val);vec = X * vec;ofstream out("D:\\hx\\data\\result.dat", ios::out | ios::binary);for (int j = 0; j < n; j++) {for (int i = m-1; i >=0; i--) {out.write((char*)& vec(j,i), sizeof(double));}}for (int i = m-1; i>=0; i--) {out.write((char*)& val(i), sizeof(double));}for (int i = 0; i < n; i++) {out.write((char*)& M(i), sizeof(double));}cout << "finish" << endl;finish = clock();cout << "time:" << (double)(finish - start) / CLOCKS_PER_SEC << endl;//readRead r;r.cal();ans_val = r.get_val();for (int i = 0; i < m; i++) {cout << ans_val[i] << endl;}//teststring obj_M = "D:\\hx\\data\\meanS.obj";string obj_A = "D:\\hx\\data\\A.obj";string obj_B = "D:\\hx\\data\\B.obj";ofstream out_objM(obj_M);ofstream out_objA(obj_A);for (int i = 0; i < n; i += 3) {out_objM << "v " << M(i) << " " << M(i + 1) << " " << M(i + 2) << endl;}int change = m - 5;A = M;for (int i = 0; i < n; i ++) {for (int j = 1; j < change; j++) {A(i) += (0.1/148)*vec(i, j);}A(i) += 0.9*vec(i, change);for (int k = change+1; k < m; k++) {A(i) += (0.1 / 148)*vec(i, k);}}for (int i = 0; i < n; i += 3) {out_objA << "v " << A(i) << " " << A(i + 1) << " " << A(i + 2) << endl;}string get_face = "D:\\hx\\data\\1.txt";ifstream read(get_face);while (!read.eof()) {string tmp;read >> tmp;char flag = tmp[0];out_objA << tmp <<" ";read >> tmp;out_objA << tmp << " ";read >> tmp;out_objA << tmp << " ";if (flag == 'f') {read >> tmp;out_objA << tmp << " ";read >> tmp;out_objA << tmp << " ";}out_objA << endl;}int K = 1;while (K++) {cin >> change;stringstream ss;ss << K;string num = ss.str();string s = "D:\\hx\\data\\B"+num+".obj";ofstream out_objB(s);B = M;for (int i = 0; i < n; i++) {for (int j = 1; j < change; j++) {B(i) += (0.1 / 148)*vec(i, j);}B(i) += 0.9*vec(i, change);for (int k = change + 1; k < m; k++) {B(i) += (0.1 / 148)*vec(i, k);}}for (int i = 0; i < n; i += 3) {out_objB << "v " << B(i) << " " << B(i + 1) << " " << B(i + 2) << endl;}ifstream read1(get_face);while (!read1.eof()) {string tmp;read1 >> tmp;char flag = tmp[0];out_objB << tmp << " ";read1 >> tmp;out_objB << tmp << " ";read1 >> tmp;out_objB << tmp << " ";if (flag == 'f') {read1 >> tmp;out_objB << tmp << " ";read1 >> tmp;out_objB << tmp << " ";}out_objB << endl;}read1.close();read1.clear();out_objB.close();cout << "done" << endl;}return 0;
}

3dmm计算特征向量,c++读写txt和二进制记录相关推荐

  1. Matlab按照二进制读写txt文件

    1.Matlab按照二进制读txt文件 data = textread('...\file.txt','%s');%二进制读 2.Matlab按照二进制写txt文件 fid = fopen('...\ ...

  2. C++读写txt文件方式以及基于opencv的Mat数据类型读写txt文件

    一.打开文件 在fstream类中,有一个成员函数open(),就是用来打开文件的,其原型是: void open(const char* filename,int mode,int access); ...

  3. VB 读写TXT文本文件函数

    以下两个函数分别读取TXT文本文件与写入文件 Private Function GetTXT(Path As String) '读取文本     Open Path For Input As #1   ...

  4. python读取txt文件写入-Python读写txt文本文件的操作方法全解析

    一.文件的打开和创建 >>> f = open('/tmp/test.txt') >>> f.read() 'hello python! hello world! ...

  5. python读取txt文件_python实现读写txt文件的几种方法

    一.读写模式: w:向文件中写入内容,w会清空原来文本内容 a:向文件中追加内容 r:从文件中读取内容 wb:以二进制形式写入内容. rb:以二进制形式读文件内容 ab:以二进制形式追加内容 a+.r ...

  6. C语言之文件读写探究(四):fwrite、fread(一次读写一块数据(二进制操作))

    相关博文:C语言之文件读写探究(一):fopen.fclose(文件的打开和关闭) 相关博文:C语言之文件读写探究(二):fputc.fgetc.feof(一次读写一个字符(文本操作)) 相关博文:C ...

  7. 简述sd卡2.0协议_【正点原子FPGA连载】第十二章SD卡读写TXT文本实验-领航者 ZYNQ 之嵌入式开发指南...

    1)实验平台:正点原子领航者ZYNQ开发板 2)平台购买地址:https://item.taobao.com/item.htm?&id=606160108761 3)全套实验源码+手册+视频下 ...

  8. Python如何实现读写txt文件?读写txt文件的方法有哪些?

    前言 又是一篇纯知识点的文章,现在看文章的人越来越少了,是都去看视频了吗 今天就来聊聊 - Python实现读写txt文件的方法 一.读写模式: w:向文件中写入内容,w会清空原来文本内容 a:向文件 ...

  9. c# 逐行写txt_C#读写TxT文件

    文/嶽永鹏 WPF 中读取和写入TxT 是经常性的操作,本篇将从详细演示WPF如何读取和写入TxT文件. 首先,TxT文件希望逐行读取,并将每行读取到的数据作为一个数组的一个元素,因此需要引入List ...

  10. 【正点原子FPGA连载】第十四章SD卡读写TXT文本实验 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南

    1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=692450874670 3)全套实验源码+手册+视频下载地址: h ...

最新文章

  1. 一套完整的数字无线监控系统需要哪些设备和材料?
  2. lisp封装成vla函数_Lisp List 和函数式编程 (in Python)
  3. 让我们来开发一种更类似人脑的神经网络吧(五)
  4. 机器学习Sklearn实战——其他线性模型
  5. 2018 年,我们该如何使用 JavaScript?
  6. 别琢磨了,企业高效灵活运作的秘密拿走:企业邮箱5折起!分享会场抽取苹果手机和猫超卡!
  7. 【HTML+CSS网页设计与布局 从入门到精通】第15章-表格格式:边距/居中/边框/折叠
  8. 单线程和多线程的区别
  9. 57. TCP relay功能描述及Python实现
  10. ZOJ-1010 奇偶剪枝
  11. 如何更改计算机管理员用户名和密码,管理员如何在Windows 10中更改其他用户的密码...
  12. SpringCloud 与 SpringBoot 微服务 架构 | 面试题及答案详解
  13. python爬京东联盟_有接入京东联盟,但是发现问题好多啊
  14. 李开复就中国移动开发者大会的演讲总结
  15. View中TouchSlop,VelocityTracker,GestureDetector
  16. 你所不了解的DevOps
  17. 查看java安装路径[linux]
  18. 以数字技术推动行业跃迁,容联云抢先迈进云联络中心智能化阶段
  19. 1 C语言的基本知识
  20. 【人工智能行业大师访谈2】吴恩达采访 Pieter Abbeel

热门文章

  1. 位图和矢量图区别,PS和AI的区别
  2. 稳定版本php源包下载,PHPWind历史版本及升级包下载(v1.0.0 - v9.0.2、Ofstar to PW)20170501更新...
  3. socksCap32+socks2http软件
  4. UrlRewrite重写url
  5. 常用股票软件linux,在 Linux 下看股票?
  6. java通讯录 批量生成 .vcf文件, .csv文件批量生成 .vcf,手机自动导入
  7. tushare找出箱体突破点
  8. Android基础入门教程——9.1 使用SoundPool播放音效(Duang~)
  9. Linux的PDF工具,Linux 系统中的pdf阅读器以及工具
  10. 如何搭建属于自己的网站博客?(手把手教你)