blob: 6575056ccf3f89dbb0d1102e3905b850234ceced [file] [log] [blame]
#include "harris.h"
// harris kernel from polymage_naive.cpp
void harrisKernel(int height, int width, float inputImg[4 + HEIGHT][4 + WIDTH],
float outputImg[HEIGHT][WIDTH],
float Ix[2 + HEIGHT][2 + WIDTH],
float Iy[2 + HEIGHT][2 + WIDTH],
float Ixx[2 + HEIGHT][2 + WIDTH],
float Ixy[2 + HEIGHT][2 + WIDTH],
float Iyy[2 + HEIGHT][2 + WIDTH], float Sxx[HEIGHT][WIDTH],
float Sxy[HEIGHT][WIDTH], float Syy[HEIGHT][WIDTH],
float det[HEIGHT][WIDTH], float trace[HEIGHT][WIDTH]) {
for (int _i0 = 0; _i0 < height + 2; _i0++) {
for (int _i1 = 0; _i1 < width + 2; _i1++) {
Iy[_i0][_i1] = inputImg[_i0][_i1] * -0.0833333333333f +
inputImg[_i0][_i1 + 2] * 0.0833333333333f +
inputImg[_i0 + 1][_i1] * -0.166666666667f +
inputImg[_i0 + 1][_i1 + 2] * 0.166666666667f +
inputImg[_i0 + 2][_i1] * -0.0833333333333f +
inputImg[_i0 + 2][_i1 + 2] * 0.0833333333333f;
}
}
for (int _i0 = 0; _i0 < height + 2; _i0++) {
for (int _i1 = 0; _i1 < width + 2; _i1++) {
Ix[_i0][_i1] = inputImg[_i0][_i1] * -0.0833333333333f +
inputImg[_i0 + 2][_i1] * 0.0833333333333f +
inputImg[_i0][_i1 + 1] * -0.166666666667f +
inputImg[_i0 + 2][_i1 + 1] * 0.166666666667f +
inputImg[_i0][_i1 + 2] * -0.0833333333333f +
inputImg[_i0 + 2][_i1 + 2] * 0.0833333333333f;
}
}
for (int _i0 = 0; _i0 < height + 2; _i0++) {
for (int _i1 = 0; _i1 < width + 2; _i1++) {
Iyy[_i0][_i1] = Iy[_i0][_i1] * Iy[_i0][_i1];
}
}
for (int _i0 = 0; _i0 < height + 2; _i0++) {
for (int _i1 = 0; _i1 < width + 2; _i1++) {
Ixy[_i0][_i1] = Ix[_i0][_i1] * Iy[_i0][_i1];
}
}
for (int _i0 = 0; _i0 < height + 2; _i0++) {
for (int _i1 = 0; _i1 < width + 2; _i1++) {
Ixx[_i0][_i1] = Ix[_i0][_i1] * Ix[_i0][_i1];
}
}
for (int _i0 = 0; _i0 < height; _i0++) {
for (int _i1 = 0; _i1 < width; _i1++) {
Syy[_i0][_i1] =
Iyy[_i0 + 1][_i1] + Iyy[_i0][_i1 + 1] + Iyy[_i0][_i1 + 2] +
Iyy[_i0 + 1][_i1] + Iyy[_i0 + 1][_i1 + 1] + Iyy[_i0 + 1][_i1 + 2] +
Iyy[_i0 + 2][_i1] + Iyy[_i0 + 2][_i1 + 1] + Iyy[_i0 + 2][_i1 + 2];
}
}
for (int _i0 = 0; _i0 < height; _i0++) {
for (int _i1 = 0; _i1 < width; _i1++) {
Sxy[_i0][_i1] = Ixy[_i0][_i1] + Ixy[_i0][_i1 + 1] + Ixy[_i0][_i1 + 2] +
Ixy[_i0 + 1][_i1] + Ixy[_i0 + 1][_i1 + 1] +
Ixy[_i0 + 1][_i1 + 2] + Ixy[_i0 + 2][_i1] +
Ixy[_i0 + 2][_i1 + 1] + Ixy[_i0 + 2][_i1 + 2];
}
}
for (int _i0 = 0; _i0 < height; _i0++) {
for (int _i1 = 0; _i1 < width; _i1++) {
Sxx[_i0][_i1] = Ixx[_i0][_i1] + Ixx[_i0][_i1 + 1] + Ixx[_i0][_i1 + 2] +
Ixx[_i0 + 1][_i1] + Ixx[_i0 + 1][_i1 + 1] +
Ixx[_i0 + 1][_i1 + 2] + Ixx[_i0 + 2][_i1] +
Ixx[_i0 + 2][_i1 + 1] + Ixx[_i0 + 2][_i1 + 2];
}
}
for (int _i0 = 0; _i0 < height; _i0++) {
for (int _i1 = 0; _i1 < width; _i1++) {
trace[_i0][_i1] = Sxx[_i0][_i1] + Syy[_i0][_i1];
}
}
for (int _i0 = 0; _i0 < height; _i0++) {
for (int _i1 = 0; _i1 < width; _i1++) {
det[_i0][_i1] =
Sxx[_i0][_i1] * Syy[_i0][_i1] - Sxy[_i0][_i1] * Sxy[_i0][_i1];
}
}
for (int _i0 = 0; _i0 < height; _i0++) {
for (int _i1 = 0; _i1 < width; _i1++) {
outputImg[_i0][_i1] =
det[_i0][_i1] - 0.04f * trace[_i0][_i1] * trace[_i0][_i1];
}
}
}