31 const Dimensions &controlPoints,
const std::pair<size_t, size_t> &noOfPatches,
32 int verbosity,
int solverIters);
36 const Dimensions &controlPoints,
const std::pair<size_t, size_t> &noOfPatches,
37 int verbosity,
int solverIters) {
38 if(verbosity) std::cout <<
"Computing BSpline coefficients" << std::endl;
40 int lX = controlPoints.
x();
41 int lY = controlPoints.
y();
42 int lT = controlPoints.
n();
43 int noOfPatchesXY = noOfPatches.first * noOfPatches.second;
47 T hX = (lX == 3) ? movieSize.
x() : (movieSize.
x() / (T)(lX-3));
48 T hY = (lY == 3) ? movieSize.
y() : (movieSize.
y() / (T)(lY-3));
49 T hT = (lT == 3) ? movieSize.
n() : (movieSize.
n() / (T)(lT-3));
51 for (
auto &&r : alignment.
shifts) {
53 auto shift = r.second;
54 int tileIdxT = meta.id_t;
55 int tileCenterT = tileIdxT * 1 + 0 + 0;
56 int tileIdxX = meta.id_x;
57 int tileIdxY = meta.id_y;
58 int tileCenterX = meta.rec.getCenter().x;
59 int tileCenterY = meta.rec.getCenter().y;
60 int i = (tileIdxY * noOfPatches.first) + tileIdxX;
62 for(
int controlIdxT = -1; controlIdxT < (lT - 1); ++controlIdxT) {
63 T tmpT =
Bspline03((tileCenterT / hT) - controlIdxT);
64 if (tmpT == (T)0)
continue;
65 for(
int controlIdxY = -1; controlIdxY < (lY - 1); ++controlIdxY) {
66 T tmpY =
Bspline03((tileCenterY / hY) - controlIdxY);
67 if (tmpY == (T)0)
continue;
68 for(
int controlIdxX = -1; controlIdxX < (lX - 1); ++controlIdxX) {
69 T tmpX =
Bspline03((tileCenterX / hX) - controlIdxX);
70 T val = tmpT * tmpY * tmpX;
71 int j = ((controlIdxT + 1) * lX * lY) +
72 ((controlIdxY + 1) * lX) + (controlIdxX + 1);
73 MAT_ELEM(A,tileIdxT*noOfPatchesXY + i, j) = val;
77 VEC_ELEM(bX,tileIdxT*noOfPatchesXY + i) = -shift.x;
78 VEC_ELEM(bY,tileIdxT*noOfPatchesXY + i) = -shift.y;
85 return std::make_pair(coefsX, coefsY);
90 size_t x,
size_t y,
size_t n);
93 size_t x,
size_t y,
size_t n);
96 size_t x,
size_t y,
size_t n) {
100 dim.
x(), dim.
y(), dim.
n(),
105 return std::make_pair(shiftX, shiftY);
110 int xdim,
int ydim,
int ndim,
112 T &shiftY, T &shiftX,
113 const T *coeffsX,
const T *coeffsY) {
119 T hX = (lX == 3) ? xdim : (xdim / (T) (lX - 3));
120 T hY = (lY == 3) ? ydim : (ydim / (T) (lY - 3));
121 T hT = (lN == 3) ? ndim : (ndim / (T) (lN - 3));
128 for (
int idxT =
max(-1, (
int) (tPos) - 1);
129 idxT <=
min((
int) (tPos) + 2, lN - 2);
132 for (
int idxY =
max(-1, (
int) (yPos) - 1);
133 idxY <=
min((
int) (yPos) + 2, lY - 2);
136 for (
int idxX =
max(-1, (
int) (xPos) - 1);
137 idxX <=
min((
int) (xPos) + 2, lX - 2);
140 T tmp = tmpX * tmpY * tmpT;
141 if (fabsf(tmp) > delta) {
142 size_t coeffOffset = (idxT + 1) * (lX * lY)
143 + (idxY + 1) * lX + (idxX + 1);
144 shiftX += coeffsX[coeffOffset] * tmp;
145 shiftY += coeffsY[coeffOffset] * tmp;
void min(Image< double > &op1, const Image< double > &op2)
static std::pair< T, T > getShift(const BSplineGrid< T > &grid, Dimensions dim, size_t x, size_t y, size_t n)
std::vector< std::pair< FramePatchMeta< T >, Point2D< T > > > shifts
static T Bspline03(T argument)
constexpr const Matrix1D< T > & getCoeffsX() const
constexpr const Dimensions & getDim() const
constexpr const Matrix1D< T > & getCoeffsY() const
#define MAT_ELEM(m, i, j)
CUDA_HD constexpr size_t x() const
static void solve(Matrix1D< T > &bXt, Matrix1D< T > &bYt, Matrix2D< T > &At, Matrix1D< T > &shiftXt, Matrix1D< T > &shiftYt, int verbosity, int iterations)
void max(Image< double > &op1, const Image< double > &op2)
CUDA_HD constexpr size_t y() const
CUDA_HD constexpr size_t n() const
static std::pair< Matrix1D< T >, Matrix1D< T > > computeBSplineCoeffs(const Dimensions &movieSize, const LocalAlignmentResult< T > &alignment, const Dimensions &controlPoints, const std::pair< size_t, size_t > &noOfPatches, int verbosity, int solverIters)