You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
110 lines
3.8 KiB
110 lines
3.8 KiB
6 months ago
|
#pragma once
|
||
|
#include "featureMatch.h"
|
||
|
#include "graphPro.h"
|
||
|
#include "topology.h"
|
||
|
#include "levmar.h"
|
||
|
#include <iostream>
|
||
|
#include <fstream>
|
||
|
|
||
|
#define PENALTY_COEFF 0.10 //! set for LM only
|
||
|
#define Lambada 0.12 //! set for BA only
|
||
|
#define OPT_GROUP_NUM 30
|
||
|
#define BKGRNDPIX 255
|
||
|
#define Need_Mask 1
|
||
|
|
||
|
using namespace std;
|
||
|
using namespace cv;
|
||
|
using namespace Utils;
|
||
|
|
||
|
struct Match_Net
|
||
|
{
|
||
|
int imgNo; //! image no. start from 0
|
||
|
vector<int> relatedImgs; //! the position index of overlap-image in visitOrder
|
||
|
vector<vector<Point2d> > PointSet;
|
||
|
};
|
||
|
|
||
|
struct LMData
|
||
|
{
|
||
|
vector<Match_Net> *matchPtr;
|
||
|
vector<Mat_<double> > *modelPtr;
|
||
|
vector<TreeNode> visitOrder;
|
||
|
int sIndex;
|
||
|
int eIndex;
|
||
|
};
|
||
|
|
||
|
//--------------------------------------------------------------------
|
||
|
|
||
|
//! Notification : imgIndex/imgNo start from 0
|
||
|
|
||
|
class ImageAligner
|
||
|
{
|
||
|
public:
|
||
|
ImageAligner(vector<string> filePathList)
|
||
|
{
|
||
|
_filePathList = filePathList;
|
||
|
_imgNum = filePathList.size();
|
||
|
_refImgNo = 0;
|
||
|
};
|
||
|
~ImageAligner(){};
|
||
|
|
||
|
public:
|
||
|
//*** functions for sorting the topological relationship of images ***//
|
||
|
void sortImageOrder(int referNo, bool shallLoad, bool isInorder);
|
||
|
void divideImageGroups();
|
||
|
bool loadMatchPts(int imgIndex1, int imgIndex2, vector<Point2d> &pointSet1, vector<Point2d> &pointSet2);
|
||
|
|
||
|
public:
|
||
|
//*** functions for building and optimizing the alignment ***//
|
||
|
void imageStitcherbyGroup(int referNo);
|
||
|
void imageStitcherbySolos(int referNo);
|
||
|
void fillImageMatchNet();
|
||
|
//! initial alignment by affine model
|
||
|
void solveGroupModels(int sIndex, int eIndex);
|
||
|
//! initial alignment by similarity transformation model
|
||
|
void solveGroupModelsS(int sIndex, int eIndex);
|
||
|
//! initial alignment by affine model
|
||
|
void solveSingleModel(int imgIndex);
|
||
|
int findVisitIndex(int imgNo);
|
||
|
//! alignment refinement to homographic model : LM Optimization
|
||
|
void RefineAligningModels(int sIndex, int eIndex);
|
||
|
void buildIniSolution(double* X, int sIndex, int eIndex);
|
||
|
static void OptimizationFunction(double* X, double* d, int m, int n, void* data);
|
||
|
//! alignment refinement to homographic model : Least Square Optimization
|
||
|
void bundleAdjustingA(int sIndex, int eIndex); //! method 1 : big matrix
|
||
|
void bundleAdjustinga(int sIndex, int eIndex); //! method 1 : normalize by point
|
||
|
void bundleAdjusting(int sIndex, int eIndex); //! method 2 : normalize by point
|
||
|
void buildIniSolution(double* X, double* initX, int sIndex, int eIndex);
|
||
|
|
||
|
double CalWarpDeviation(vector<Point2d> pointSet1, vector<Point2d> pointSet2, Mat_<double> cvtMat, vector<double> weightList);
|
||
|
//! detect potential overlapping relationships based on the new position (only used in the refinement)
|
||
|
void recheckTopology(int sIndex, int eIndex);
|
||
|
|
||
|
//! display or output functions
|
||
|
Rect setImageSize(vector<Point2d> &nodePts);
|
||
|
void saveMosaicImage(); //! aligning in added order
|
||
|
void saveMosaicImageP(); //! aligning in image no. order
|
||
|
void outputPrecise();
|
||
|
void loadHomographies();
|
||
|
void saveModelParams();
|
||
|
void drawTopologyNet();
|
||
|
void labelGroupNodes();
|
||
|
void drawSimilarMatrix();
|
||
|
|
||
|
private:
|
||
|
PointMatcher *_matcher;
|
||
|
Mat_<int> _similarityMat;
|
||
|
int _refImgNo;
|
||
|
int _imgNum;
|
||
|
int _alignedNum;
|
||
|
vector<int> _groupCusorList;
|
||
|
vector<TreeNode> _visitOrder; //! aligning order according this stack
|
||
|
vector<Quadra> _projCoordSet; //! same order with "_visitOrder"
|
||
|
vector<Match_Net> _matchNetList; //! matching relation of each image (order agree with image no.)
|
||
|
vector<Mat_<double> > _alignModelList; //! aligning model parameters of each image (order agree with '_visitOrder')
|
||
|
vector<Mat_<double> > _initModelList;
|
||
|
|
||
|
vector<double> reliabilityList; //! record the mean square error of the initial affine model of each image
|
||
|
vector<string> _filePathList;
|
||
|
vector<Size> _imgSizeList; //! order agree with image no.
|
||
|
};
|