23 #ifndef MODELFITTING_OPENCVMATIMAGETRAITS_H 24 #define MODELFITTING_OPENCVMATIMAGETRAITS_H 26 #define INTERP_MAXKERNELWIDTH 8 // Max. range of kernel (pixels) 28 #include <boost/math/constants/constants.hpp> 33 #include <opencv2/opencv.hpp> 45 using iterator = decltype(std::declval<cv::Mat>().begin<double>());
48 return cv::Mat::zeros((
int)
height, (
int)
width, CV_64F);
60 return image.at<
double>((int)
y, (
int)
x);
64 return image.at<
double>((int)
y, (
int)
x);
68 return image.begin<
double>();
72 return image.end<
double>();
76 double scale_factor,
double x,
double y) {
78 double scaled_width =
width(image2) * scale_factor;
79 double scaled_height =
height(image2) * scale_factor;
83 int window_width = x_max - x_min;
86 int window_height = y_max - y_min;
88 double x_shift =
x - scaled_width / 2. - x_min;
89 double y_shift =
y - scaled_height / 2. - y_min;
91 auto window =
factory(window_width, window_height);
100 shiftResize(image2, window, scale_factor, x_shift, y_shift);
104 double corr_factor = 1. / (scale_factor * scale_factor);
105 window = corr_factor * window;
108 for (
int y_im=
std::max(y_min,0); y_im<
std::min(y_max,image1.rows); ++y_im) {
109 int x_win = x_im - x_min;
110 int y_win = y_im - y_min;
111 at(image1, x_im, y_im) +=
at(window, x_win, y_win);
120 static void shiftResize(
const cv::Mat& source, cv::Mat& window,
double scale_factor,
double x_shift,
double y_shift) {
121 int window_width =
width(window);
122 int window_height =
height(window);
123 for(
int x_win=0; x_win < window_width; x_win++) {
124 for(
int y_win=0; y_win < window_height; y_win++) {
125 double x = (x_win - 0.5 - x_shift) / scale_factor + 0.5;
126 double y = (y_win - 0.5 - y_shift) / scale_factor + 0.5;
131 double x_delta =
x - xi;
132 double y_delta =
y - yi;
139 at(window, x_win, y_win) = (1.0 - y_delta) * ((1.0 - x_delta) * v00 + x_delta * v10) +
140 y_delta * ((1.0 - x_delta) * v01 + x_delta * v11);
162 int xsize,
int ysize,
interpenum interptype) {
164 static const int interp_kernwidth[5]={1,2,4,6,8};
168 *kvector, *pixin, *pixout,
170 int i, j, ix, iy, kwidth, step;
172 kwidth = interp_kernwidth[interptype];
176 ix = (int)(
x-0.50001);
177 iy = (int)(
y-0.50001);
189 if (ix < 0 || ix + kwidth <= 0 || ix + kwidth > xsize ||
190 iy < 0 || iy + kwidth <= 0 || iy + kwidth > ysize)
195 step = xsize - kwidth;
196 pixin = pix + iy * xsize + ix ;
198 for (j = kwidth; j--;) {
201 for (i = kwidth; i--;)
202 val += *(kvector++) * *(pixin++);
212 for (i = kwidth; i--;)
213 val += *(kvector++) * *(pixin++);
220 const float pi = boost::math::constants::pi<float>();
221 const float threshold = 1
e-6;
222 float x, val, sinx1,sinx2,sinx3,cosx1;
227 *(kernel++) = 1.0 - pos;
230 if (pos < threshold && pos > - threshold) {
236 x = -
pi / 2.0 * (pos + 1.0);
237 sincosf(
x, &sinx1, &cosx1);
238 val = (*(kernel++) = sinx1 / (
x *
x));
240 val += (*(kernel++) = -cosx1 / (
x *
x));
242 val += (*(kernel++) = -sinx1 / (
x *
x));
244 val += (*kernel = cosx1 / (
x *
x));
252 if (pos < threshold && pos > - threshold) {
260 x = -
pi / 3.0 * (pos + 2.0);
261 sincosf(
x, &sinx1, &cosx1);
262 val = (*(kernel++) = sinx1 / (
x *
x));
264 val += (*(kernel++) = (sinx2 = -0.5 * sinx1 - 0.866025403785 * cosx1)
267 val += (*(kernel++) = (sinx3 = - 0.5 * sinx1 + 0.866025403785 * cosx1)
270 val += (*(kernel++) = sinx1 / (
x *
x));
272 val += (*(kernel++) = sinx2 / (
x *
x));
274 val += (*kernel = sinx3 / (
x *
x));
284 if (pos < threshold && pos > - threshold) {
294 x = -
pi / 4.0 * (pos + 3.0);
295 sincosf(
x, &sinx1, &cosx1);
296 val = (*(kernel++) = sinx1 / (
x *
x));
298 val += (*(kernel++) = - (sinx2 = 0.707106781186 * (sinx1 + cosx1))
301 val += (*(kernel++) = cosx1 / (
x *
x));
303 val += (*(kernel++) = - (sinx3 = 0.707106781186 * (cosx1 - sinx1))
306 val += (*(kernel++) = -sinx1 / (
x *
x));
308 val += (*(kernel++) = sinx2 / (
x *
x));
310 val += (*(kernel++) = -cosx1 / (
x *
x));
312 val += (*kernel = sinx3 / (
x *
x));
#define INTERP_MAXKERNELWIDTH
static ImageType factory(std::size_t width, std::size_t height)
static void addImageToImage(cv::Mat &image1, const cv::Mat &image2, double scale_factor, double x, double y)
static std::size_t height(ImageType &image)
static void make_kernel(float pos, float *kernel, interpenum interptype)
std::shared_ptr< DependentParameter< std::shared_ptr< EngineParameter > > > x
static double & at(ImageType &image, std::size_t x, std::size_t y)
decltype(std::declval< cv::Mat >().begin< double >()) iterator
std::shared_ptr< DependentParameter< std::shared_ptr< EngineParameter > > > y
static double & at(cv::Mat &image, std::size_t x, std::size_t y)
static std::size_t height(const cv::Mat &image)
static float interpolate_pix(float *pix, float x, float y, int xsize, int ysize, interpenum interptype)
std::shared_ptr< EngineParameter > dx
static iterator end(cv::Mat &image)
static iterator begin(cv::Mat &image)
static cv::Mat factory(std::size_t width, std::size_t height)
static double at(const cv::Mat &image, std::size_t x, std::size_t y)
static void shiftResize(const cv::Mat &source, cv::Mat &window, double scale_factor, double x_shift, double y_shift)
static std::size_t width(ImageType &image)
static std::size_t width(const cv::Mat &image)
std::shared_ptr< EngineParameter > dy
static double getClamped(const cv::Mat &image, int x, int y)