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.
143 lines
4.3 KiB
143 lines
4.3 KiB
/*
|
|
Copyright (C) 2014 Jerome Revaud
|
|
|
|
This program is free software: you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>
|
|
*/
|
|
#ifndef ___DEEP_MATCHING_H___
|
|
#define ___DEEP_MATCHING_H___
|
|
#include "array_types.h"
|
|
#include "pixel_desc.h"
|
|
#include "image.h"
|
|
|
|
#include <vector>
|
|
using namespace std;
|
|
|
|
|
|
// deep matching parameters
|
|
typedef struct {
|
|
desc_params_t desc_params;
|
|
|
|
int prior_img_downscale;// downscale the image by 2^(this) prior to matching
|
|
int rot45; // rotate second img by (45*rot45) prior to matching
|
|
int overlap; // pyramid level at which patches starts to overlap (999 => no overlap at all)
|
|
bool subsample_ref; // true if larger patches higher in the pyramid are not densely sampled
|
|
float nlpow; // non-linear power rectification
|
|
int ngh_rad; // neighborhood size in pixels => crop res_map (0 == infinite)
|
|
int maxima_mode; // 1: standard / 0: from all top-level patches
|
|
int min_level; // minimum pyramid level to retrieve maxima
|
|
int max_psize; // maximum patch size
|
|
int low_mem; // use less memory to retrieve the maxima (but approximate result)
|
|
int scoring_mode; // 0: like ICCV paper / 1: improved scoring mode
|
|
int verbose; // verbosity
|
|
int n_thread; // parallelization on several cores, when possible
|
|
|
|
} dm_params_t;
|
|
|
|
// set default parameters
|
|
void set_default_dm_params( dm_params_t* params );
|
|
|
|
// scale & rotation invariant version
|
|
typedef struct {
|
|
bool fast; // avoid comparing small scaled versions of both images
|
|
int min_sc0, max_sc0; // scale range of image0 (expressed as scale=2^(-n/2))
|
|
int min_sc1, max_sc1; // scale range of image1 (expressed as scale=2^(-n/2))
|
|
int min_rot, max_rot; // rotation range (expressed as multiples of 45 degrees)
|
|
|
|
} scalerot_params_t;
|
|
|
|
// set default parameters
|
|
void set_default_scalerot_params( scalerot_params_t* params );
|
|
|
|
|
|
// response maps at a given scale
|
|
typedef struct {
|
|
int f; // subsampling factor with respect to original image size
|
|
int patch_size; // patch size in original image coordinates in first image
|
|
int_cube grid; // position (center) of each patch in first image
|
|
float_image norms; // norm of each patch in first image
|
|
int_array assign; // mapping between patches and their response maps
|
|
float_layers res_map; // response map of the patches on the second image
|
|
float_layers max_map; // max-filtered response map
|
|
int true_shape[2]; // true res_map shape (width, height) in case of crop (if ngh_rad>0)
|
|
int_image offsets; // res_map offsets in case of crop (if ngh_rad>0)
|
|
int_cube children; // index of children patches in the previous level
|
|
float_array passed; // remember the best score so far at each response when doing argmax
|
|
|
|
} res_scale;
|
|
|
|
typedef vector<res_scale> matching_pyramid_t;
|
|
|
|
|
|
// output correspondences
|
|
typedef struct {
|
|
float x0, y0; // position in first image (reference image)
|
|
float x1, y1; // position in second image (target image)
|
|
float maxima; // from which maxima it was generated (index)
|
|
float score; // matching score
|
|
} corres_t;
|
|
|
|
// for scale rot invariant matching
|
|
typedef struct {
|
|
float rot[6];
|
|
float_cube corres0;
|
|
float_cube corres1;
|
|
} full_corres_t;
|
|
|
|
|
|
// main function. Returns a float_image where each row is <corres_t>
|
|
float_image* deep_matching( image_t* img0, image_t* img1, const dm_params_t* params,
|
|
full_corres_t* corres_out ); // NULL if you don't use it
|
|
|
|
// main function for scale & invariant matching. output is same as above.
|
|
float_image* deep_matching_scale_rot( image_t* img0, image_t* img1, dm_params_t* params,
|
|
const scalerot_params_t* sr_params );
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|