21 #if !defined(SPARSE_BUNDLE_CPU_H)
22 #define SPARSE_BUNDLE_CPU_H
27 #define VECTOR_ALIGNMENT 32
29 #define VECTOR_ALIGNMENT_MASK (VECTOR_ALIGNMENT - 1)
30 #define ALIGN_PTR(p) \
31 ((((size_t)p) + VECTOR_ALIGNMENT_MASK) & (~VECTOR_ALIGNMENT_MASK))
35 template <
class Float>
48 if (p ==
NULL)
throw std::bad_alloc();
52 if (p ==
NULL)
throw std::bad_alloc();
65 char* p3 = ((
char*)p) - 1;
66 free(((
char*)p) - p3[0]);
74 _size = _capacity = 0;
78 _size = _capacity =
count;
79 _last = _data +
count;
86 inline void resize(
size_t newcount) {
89 _capacity = _size = 0;
92 if (newcount <= _capacity) {
94 _last = _data + newcount;
98 _size = _capacity = newcount;
99 _last = _data + newcount;
108 _last = _data + _size;
112 bool _owner_bak = _owner;
113 Float* _data_bak = _data;
114 Float* _last_bak = _last;
115 size_t _size_bak = _size;
116 size_t _capa_bak = _capacity;
118 _owner =
next._owner;
122 _capacity =
next._capacity;
124 next._owner = _owner_bak;
125 next._data = _data_bak;
126 next._last = _last_bak;
127 next._size = _size_bak;
128 next._capacity = _capa_bak;
131 inline operator Float*() {
return _size ? _data :
NULL; }
132 inline operator Float*
const()
const {
return _data; }
134 inline Float*
data() {
return _size ? _data :
NULL; }
135 inline Float*
end() {
return _last; }
136 inline const Float*
begin()
const {
return _size ? _data :
NULL; }
137 inline const Float*
end()
const {
return _last; }
138 inline size_t size()
const {
return _size; }
139 inline size_t IsValid()
const {
return _size; }
143 template <
class Float>
209 Float* qmapw, Float* qlistw);
251 static int FindProcessorCoreNum();
269 virtual ConfigBA* GetInternalConfig() {
return this; }
276 const int* point_idx,
const int* cam_idx);
277 virtual void SetFocalMask(
const int* fmask,
float weight);
void ParseParam(int argc, char **argv)
int __use_radial_distortion
virtual void AbortBundleAdjustment()
virtual void EnableRadialDistortion(DistortionT type)
std::vector< int > VectorI
virtual int GetCurrentIteration()
bool InitializeStorageForCG()
void SaveBundleRecord(int iter, float res, float damping, float &g_norm, float &g_inf)
bool InitializeStorageForSFM()
VectorI _cuCameraMeasurementMap
virtual void SetProjection(size_t nproj, const Point2D *imgpts, const int *point_idx, const int *cam_idx)
void ComputeJtE(VectorF &E, VectorF &JtE, int mode=0)
VectorF _cuVectorJtE
LM normal equation.
bool ProcessIndexCameraQ(std::vector< int > &qmap, std::vector< int > &qlist)
void RunTestIterationLM(bool reduced)
int SolveNormalEquationPCGX(float lambda)
VectorF _cuJacobianCameraT
float EvaluateProjectionX(VectorF &cam, VectorF &point, VectorF &proj)
virtual void SetNextTimeBudget(int seconds)
virtual int RunBundleAdjustment()
float EvaluateDeltaNorm()
void PrepareJacobianNormalization()
void NonlinearOptimizeLM()
int SolveNormalEquationPCGB(float lambda)
VectorI _cuCameraMeasurementListT
virtual void SetFixedIntrinsics(bool fixed)
float SaveUpdatedSystem(float residual_reduction, float dx_sqnorm, float damping)
virtual void SetCameraData(size_t ncam, CameraT *cams)
void ProcessWeightCameraQ(std::vector< int > &cpnum, std::vector< int > &qmap, Float *qmapw, Float *qlistw)
void ComputeBlockPC(float lambda, bool dampd)
virtual float GetMeanSquaredError()
virtual void SetPointData(size_t npoint, Point3D *pts)
VectorI _cuCameraMeasurementList
void ComputeDiagonal(VectorF &JJI)
const float * _imgpt_data
virtual void SetNextBundleMode(BundleModeT mode)
VectorF _cuJacobianCamera
virtual void SetFocalMask(const int *fmask, float weight)
void ComputeJX(VectorF &X, VectorF &JX, int mode=0)
int SolveNormalEquation(float lambda)
void ApplyBlockPC(VectorF &v, VectorF &pv, int mode=0)
virtual void ParseParam(int narg, char **argv)
float UpdateCameraPoint(VectorF &dx, VectorF &cuImageTempProj)
void AdjustBundleAdjsutmentMode()
float EvaluateProjection(VectorF &cam, VectorF &point, VectorF &proj)
VectorI _cuPointMeasurementMap
void TransferDataToHost()
void SaveToFile(const char *name)
const Float * end() const
static Float * allocate(size_t count)
void resize(size_t newcount)
const Float * begin() const
void swap(avec< Float > &next)
void set(Float *data, size_t count)
static void deallocate(void *p)
ParallelBA * NewSparseBundleCPU(bool dp, const int num_threads)