33 #include "ceres/ceres.h"
39 class EuclideanIntersectCostFunctor {
41 EuclideanIntersectCostFunctor(
const Marker& marker,
42 const EuclideanCamera& camera)
47 typedef Eigen::Matrix<T, 3, 3>
Mat3;
48 typedef Eigen::Matrix<T, 3, 1>
Vec3;
55 projected /= projected(2);
77 Mat3 K = Mat3::Identity();
80 for (
int i = 0; i <
markers.size(); ++i) {
88 for (
int i = 0; i <
markers.size(); ++i) {
94 LG <<
"Intersecting with " <<
markers.size() <<
" markers.";
99 Vec3 X = Xp.head<3>();
101 ceres::Problem problem;
104 int num_residuals = 0;
105 for (
int i = 0; i <
markers.size(); ++i) {
107 if (marker.
weight != 0.0) {
111 problem.AddResidualBlock(
112 new ceres::AutoDiffCostFunction<EuclideanIntersectCostFunctor,
115 new EuclideanIntersectCostFunctor(marker, camera)),
125 LG <<
"Number of residuals: " << num_residuals;
126 if (!num_residuals) {
127 LG <<
"Skipping running minimizer with zero residuals";
133 Vec3 point =
X.head<3>();
140 ceres::Solver::Options solver_options;
141 solver_options.linear_solver_type = ceres::DENSE_QR;
142 solver_options.max_num_iterations = 50;
143 solver_options.update_state_every_iteration =
true;
144 solver_options.parameter_tolerance = 1
e-16;
145 solver_options.function_tolerance = 1
e-16;
148 ceres::Solver::Summary summary;
149 ceres::Solve(solver_options, &problem, &summary);
151 VLOG(1) <<
"Summary:\n" << summary.FullReport();
154 for (
int i = 0; i < cameras.size(); ++i) {
159 LOG(ERROR) <<
"POINT BEHIND CAMERA " <<
markers[i].image <<
": "
165 Vec3 point =
X.head<3>();
174 struct ProjectiveIntersectCostFunction {
176 typedef Vec FMatrixType;
177 typedef Vec4 XMatrixType;
179 ProjectiveIntersectCostFunction(
187 for (
int i = 0; i <
markers.size(); ++i) {
188 const ProjectiveCamera& camera =
190 Vec3 projected = camera.P *
X;
191 projected /= projected(2);
192 residuals[2 * i + 0] = projected(0) -
markers[i].x;
193 residuals[2 * i + 1] = projected(1) -
markers[i].y;
211 for (
int i = 0; i <
markers.size(); ++i) {
213 cameras.push_back(camera->
P);
218 for (
int i = 0; i <
markers.size(); ++i) {
224 LG <<
"Intersecting with " <<
markers.size() <<
" markers.";
231 Solver::SolverParameters
params;
232 Solver solver(triangulate_cost);
234 Solver::Results results = solver.minimize(
params, &
X);
238 for (
int i = 0; i < cameras.size(); ++i) {
243 LOG(ERROR) <<
"POINT BEHIND CAMERA " <<
markers[i].image <<
": "
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble u2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLdouble GLdouble v2 _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLdouble GLdouble nz _GL_VOID_RET _GL_VOID GLfloat GLfloat nz _GL_VOID_RET _GL_VOID GLint GLint nz _GL_VOID_RET _GL_VOID GLshort GLshort nz _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const GLfloat *values _GL_VOID_RET _GL_VOID GLsizei const GLushort *values _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID const GLuint const GLclampf *priorities _GL_VOID_RET _GL_VOID GLdouble y _GL_VOID_RET _GL_VOID GLfloat y _GL_VOID_RET _GL_VOID GLint y _GL_VOID_RET _GL_VOID GLshort y _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLfloat GLfloat z _GL_VOID_RET _GL_VOID GLint GLint z _GL_VOID_RET _GL_VOID GLshort GLshort z _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble w _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat w _GL_VOID_RET _GL_VOID GLint GLint GLint w _GL_VOID_RET _GL_VOID GLshort GLshort GLshort w _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble y2 _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat y2 _GL_VOID_RET _GL_VOID GLint GLint GLint y2 _GL_VOID_RET _GL_VOID GLshort GLshort GLshort y2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLuint *buffer _GL_VOID_RET _GL_VOID GLdouble t _GL_VOID_RET _GL_VOID GLfloat t _GL_VOID_RET _GL_VOID GLint t _GL_VOID_RET _GL_VOID GLshort t _GL_VOID_RET _GL_VOID GLdouble t
ATTR_WARN_UNUSED_RESULT const BMVert const BMEdge * e
void InsertPoint(int track, const Vec4 &X)
ProjectiveCamera * CameraForImage(int image)
Returns a pointer to the camera corresponding to image.
const ProjectiveReconstruction & reconstruction
const vector< Marker > & markers
const EuclideanCamera & camera_
void NViewTriangulateAlgebraic(const Matrix< T, 2, Dynamic > &x, const vector< Matrix< T, 3, 4 >> &Ps, Matrix< T, 4, 1 > *X)
Eigen::Matrix< double, 3, 3 > Mat3
bool EuclideanIntersect(const vector< Marker > &markers, EuclideanReconstruction *reconstruction)
Eigen::Matrix< double, 3, 4 > Mat34
Eigen::Matrix< double, 2, Eigen::Dynamic > Mat2X
bool ProjectiveIntersect(const vector< Marker > &markers, ProjectiveReconstruction *reconstruction)
void P_From_KRt(const Mat3 &K, const Mat3 &R, const Vec3 &t, Mat34 *P)