#ifndef UI_TVR_TVR_DATA_H_
#define UI_TVR_TVR_DATA_H_
#include <stdio.h>
#include "libmv/base/vector.h"
#include "libmv/correspondence/feature_matching.h"
using libmv::vector;
struct TvrDocument {
QImage images[2];
FeatureSet feature_sets[2];
libmv::Matches matches;
libmv::Mat3 F;
double focal_distance[2];
libmv::Mat3 K[2];
libmv::Mat3 R[2];
libmv::Vec3 t[2];
vector<libmv::Vec3> X;
vector<libmv::Vec3f> X_colors;
void SaveAsBlender(const char *filename) {
FILE* fid = fopen(filename, "wb");
assert(fid);
fprintf(fid, "# libmv blender camera track export; do not edit\n");
fprintf(fid, "import Blender\n");
fprintf(fid, "from Blender import Camera, Object, Scene, NMesh\n");
fprintf(fid, "from Blender import Mathutils\n");
fprintf(fid, "from Blender.Mathutils import *\n");
fprintf(fid, "cur = Scene.GetCurrent()\n");
fprintf(fid, "# Cameras\n");
for (int i = 0; i < 2; ++i) {
fprintf(fid, "c%04d = Camera.New('persp')\n", i);
double f = K[i](0,0);
double width = images[0].width();
double lens = f / width * 32.0;
fprintf(fid, "c%04d.lens = %g\n", i, lens);
fprintf(fid, "c%04d.setDrawSize(0.05)\n", i);
fprintf(fid, "o%04d = Object.New('Camera')\n", i);
fprintf(fid, "o%04d.name = 'libmv_cam%04d'\n", i, i);
fprintf(fid, "o%04d.setMatrix(Mathutils.Matrix(",i);
for (int j = 0; j < 3; ++j) {
fprintf(fid, "[");
for (int k = 0; k < 3; ++k) {
if (j == 2 || j == 1)
fprintf(fid, "%g,", -R[i](j,k)); else
fprintf(fid, "%g,", R[i](j,k)); }
fprintf(fid, "0.0],");
}
libmv::Vec3 optical_center = -R[i].transpose() * t[i];
fprintf(fid, "[");
for (int j = 0; j < 3; ++j)
fprintf(fid, "%g,", optical_center(j));
fprintf(fid, "1.0]))\n");
fprintf(fid, "o%04d.link(c%04d)\n\n", i, i);
fprintf(fid, "cur.link(o%04d)\n\n", i);
}
fprintf(fid, "# Point cloud\n");
fprintf(fid, "ob=Object.New('Mesh','libmv_point_cloud')\n");
fprintf(fid, "ob.setLocation(0.0,0.0,0.0)\n");
fprintf(fid, "mesh=ob.getData()\n");
fprintf(fid, "cur.link(ob)\n");
for (int i = 0; i < X.size(); ++i) {
fprintf(fid, "v = NMesh.Vert(%g,%g,%g)\n", X[i](0), X[i](1), X[i](2));
fprintf(fid, "mesh.verts.append(v)\n");
}
fprintf(fid, "mesh.update()\n");
fprintf(fid, "cur.update()\n\n");
fprintf(fid, "# Add a helper object to help manipulating joined camera and"
"points\n");
fprintf(fid, "scene_dummy = Object.New('Empty','libmv_scene')\n");
fprintf(fid, "scene_dummy.setLocation(0.0,0.0,0.0)\n");
fprintf(fid, "cur.link(scene_dummy)\n");
fprintf(fid, "scene_dummy.makeParent([ob])\n");
for (int i = 0; i < 2; ++i) {
fprintf(fid, "scene_dummy.makeParent([o%04d])\n", i);
}
fprintf(fid, "\n");
fprintf(fid, "scene_dummy.SizeX=1.0\n");
fprintf(fid, "scene_dummy.SizeY=1.0\n");
fprintf(fid, "scene_dummy.SizeZ=1.0\n");
fclose(fid);
}
};
#endif