static void InitGradMagAndOrientMats( MAT& magmat, // out: grad mag mat MAT& orientmat, // out: grad ori mat const Image& img) // in: ROI scaled to current pyramid level { const int nrows = img.rows, nrows1 = img.rows-1; const int ncols = img.cols, ncols1 = img.cols-1; const double bins_per_degree = BINS_PER_HIST / 360.; magmat.create(nrows, ncols); orientmat.create(nrows, ncols); for (int y = 0; y < nrows1; y++) { const byte* const buf = (byte*)(img.data) + y * ncols; const byte* const buf_x1 = (byte*)(img.data) + y * ncols + 1; const byte* const buf_y1 = (byte*)(img.data) + (y+1) * ncols; double* const magbuf = Buf(magmat) + y * ncols; double* const orientbuf = Buf(orientmat) + y * ncols; for (int x = 0; x < ncols1; x++) { const byte pixel = buf[x]; const double xdelta = buf_x1[x] - pixel; const double ydelta = buf_y1[x] - pixel; magbuf[x] = sqrt(SQ(xdelta) + SQ(ydelta)); double orient = RadsToDegrees(atan2(ydelta, xdelta)); // -180 <= orient < 180 if (orient < 0) orient += 360; // 0 <= orient < 360 orientbuf[x] = orient * bins_per_degree; // 0 <= orient < BINS_PER_HIST } } // fill bottom and right edges magmat.row(nrows1) = 0; magmat.col(ncols1) = 0; orientmat.row(nrows1) = 0; orientmat.col(ncols1) = 0; }
static void ZapSmallEigs( MAT& eigvals, // io MAT& eigvecs) // io { const double min = eigvals(0) / 1e6; CV_Assert(min > 0); for (int eig = 0; eig < NSIZE(eigvals); eig++) if (eigvals(eig) < min) { eigvals(eig) = 0; eigvecs.row(eig) = 0; // set all eigenvector elems to 0 } }