10 # include <vcl_msvc_warnings.h> 30 unsigned ni = grad_i.
ni(), nj = grad_i.
nj();
31 assert(grad_j.
ni()==ni && grad_j.
nj()==nj );
36 for (
unsigned i=0;i<2;++i)
44 const unsigned ni2 = ni-2;
45 const unsigned nj2 = nj-2;
51 const std::ptrdiff_t oi1 = grad_i.
jstep() - grad_i.
istep();
52 const std::ptrdiff_t oi2 = grad_i.
jstep();
53 const std::ptrdiff_t oi3 = grad_i.
istep() + grad_i.
jstep();
54 const std::ptrdiff_t oi4 = -grad_i.
istep();
55 const std::ptrdiff_t oi5 = grad_i.
istep();
56 const std::ptrdiff_t oi6 = -grad_i.
istep() - grad_i.
jstep();
57 const std::ptrdiff_t oi7 = -grad_i.
jstep();
58 const std::ptrdiff_t oi8 = grad_i.
istep() - grad_i.
jstep();
60 const std::ptrdiff_t oj1 = grad_j.
jstep() - grad_j.
istep();
61 const std::ptrdiff_t oj2 = grad_j.
jstep();
62 const std::ptrdiff_t oj3 = grad_j.
istep() + grad_j.
jstep();
63 const std::ptrdiff_t oj6 = -grad_j.
istep() - grad_j.
jstep();
64 const std::ptrdiff_t oj7 = -grad_j.
jstep();
65 const std::ptrdiff_t oj8 = grad_j.
istep() - grad_j.
jstep();
67 float * d_data = &dest(2,2);
68 const float * gi_data = &grad_i(2,2);
69 const float * gj_data = &grad_j(2,2);
71 for (
unsigned j=2;j<nj2;++j)
74 const float* pgi = gi_data;
75 const float* pgj = gj_data;
76 for (
unsigned i=2;i<ni2;++i)
79 float dxdx = 0.125f*(pgi[oi3]+pgi[oi8] - (pgi[oi1]+pgi[oi6])) + 0.25f*(pgi[oi5]-pgi[oi4]);
81 float dxdy = 0.125f*(pgi[oi1]+pgi[oi3] - (pgi[oi6]+pgi[oi8])) + 0.25f*(pgi[oi2]-pgi[oi7]);
83 float dydy = 0.125f*(pgj[oj1]+pgj[oj3] - (pgj[oj6]+pgj[oj8])) + 0.25f*(pgj[oj2]-pgj[oj7]);
85 float detH = dxdx*dydy - dxdy*dxdy;
86 float traceH = dxdx+dydy;
88 *d = detH - float(k) * traceH * traceH;
90 pgi += grad_i.
istep();
91 pgj += grad_j.
istep();
95 gi_data += grad_i.
jstep();
96 gj_data += grad_j.
jstep();
97 d_data += dest.
jstep();
107 unsigned ni = grad_i.
ni(), nj = grad_i.
nj();
108 assert(grad_j.
ni()==ni && grad_j.
nj()==nj );
113 for (
unsigned i=0;i<2;++i)
121 const unsigned ni2 = ni-2;
122 const unsigned nj2 = nj-2;
128 const std::ptrdiff_t oi1 = grad_i.
jstep() - grad_i.
istep();
129 const std::ptrdiff_t oi2 = grad_i.
jstep();
130 const std::ptrdiff_t oi3 = grad_i.
istep() + grad_i.
jstep();
131 const std::ptrdiff_t oi4 = -grad_i.
istep();
132 const std::ptrdiff_t oi5 = grad_i.
istep();
133 const std::ptrdiff_t oi6 = -grad_i.
istep() - grad_i.
jstep();
134 const std::ptrdiff_t oi7 = -grad_i.
jstep();
135 const std::ptrdiff_t oi8 = grad_i.
istep() - grad_i.
jstep();
137 const std::ptrdiff_t oj1 = grad_j.
jstep() - grad_j.
istep();
138 const std::ptrdiff_t oj2 = grad_j.
jstep();
139 const std::ptrdiff_t oj3 = grad_j.
istep() + grad_j.
jstep();
140 const std::ptrdiff_t oj6 = -grad_j.
istep() - grad_j.
jstep();
141 const std::ptrdiff_t oj7 = -grad_j.
jstep();
142 const std::ptrdiff_t oj8 = grad_j.
istep() - grad_j.
jstep();
144 double * d_data = &dest(2,2);
145 const double * gi_data = &grad_i(2,2);
146 const double * gj_data = &grad_j(2,2);
148 for (
unsigned j=2;j<nj2;++j)
151 const double* pgi = gi_data;
152 const double* pgj = gj_data;
153 for (
unsigned i=2;i<ni2;++i)
156 double dxdx = 0.125f*(pgi[oi3]+pgi[oi8] - (pgi[oi1]+pgi[oi6])) + 0.25f*(pgi[oi5]-pgi[oi4]);
158 double dxdy = 0.125f*(pgi[oi1]+pgi[oi3] - (pgi[oi6]+pgi[oi8])) + 0.25f*(pgi[oi2]-pgi[oi7]);
160 double dydy = 0.125f*(pgj[oj1]+pgj[oj3] - (pgj[oj6]+pgj[oj8])) + 0.25f*(pgj[oj2]-pgj[oj7]);
162 double detH = dxdx*dydy - dxdy*dxdy;
163 double traceH = dxdx+dydy;
165 *d = detH - double(k) * traceH * traceH;
167 pgi += grad_i.
istep();
168 pgj += grad_j.
istep();
172 gi_data += grad_i.
jstep();
173 gj_data += grad_j.
jstep();
174 d_data += dest.
jstep();
Various functions for manipulating image views.
Various mathematical manipulations of 2D images.
Estimate corner positions using Forstner/Harris approach.
Concrete view of image data of type T held in memory.
void vil_math_image_product(const vil_image_view< aT > &imA, const vil_image_view< bT > &imB, vil_image_view< sumT > &im_product)
Compute pixel-wise product of two images (im_prod(i,j) = imA(i,j)*imB(i,j).
void vil_gauss_filter_5tap(const srcT *src_im, std::ptrdiff_t src_ystep, unsigned ni, unsigned nj, destT *dest_im, std::ptrdiff_t dest_ystep, const vil_gauss_filter_5tap_params ¶ms, destT *work)
Smooth a single plane src_im to produce dest_im.
void set_size(unsigned ni, unsigned nj) override
resize current planes to ni x nj.
std::ptrdiff_t jstep() const
Add this to your pixel pointer to get next j pixel.
void vil_fill_col(vil_image_view< T > &view, unsigned i, T value)
Fill column i in view with given value.
unsigned ni() const
Width.
unsigned nj() const
Height.
void vil_corners_rohr(const vil_image_view< float > &grad_i, const vil_image_view< float > &grad_j, vil_image_view< float > &dest)
Compute corner strength using Rohr's recommended method.
unsigned nplanes() const
Number of planes.
void vil_corners(const vil_image_view< float > &grad_i, const vil_image_view< float > &grad_j, vil_image_view< float > &dest, double k)
Compute Forstner/Harris corner strength function given gradient images.
void vil_math_add_image_fraction(vil_image_view< aT > &imA, scaleT fa, const vil_image_view< bT > &imB, scaleT fb)
imA = fa*imA + fb*imB (Useful for moving averages!).
std::ptrdiff_t istep() const
Add this to your pixel pointer to get next i pixel.
void vil_fill_row(vil_image_view< T > &view, unsigned j, T value)
Fill row j in view with given value.