| #include "harris.h" |
| int sum = 0; |
| |
| #ifdef BENCHMARK_LIB |
| #include "benchmark/benchmark.h" |
| #endif |
| |
| // This function initializes the input image to checkbox image |
| void initCheckboardImage(int height, int width, |
| float image[(2 + HEIGHT)][2 + WIDTH]) { |
| int last_pixel_x = 0; |
| int last_pixel_y = 0; |
| for (int i = 0; i < height; i++) { |
| if (i % BOX_SIZE == 0) { |
| last_pixel_y = (last_pixel_y + 1) % 2; |
| } |
| last_pixel_x = last_pixel_y; |
| for (int j = 0; j < width; j++) { |
| if (j % BOX_SIZE == 0) { |
| last_pixel_x = (last_pixel_x + 1) % 2; |
| } |
| if (last_pixel_x == 0) { |
| image[i][j] = 255; |
| } else { |
| image[i][j] = 0; |
| } |
| } |
| } |
| } |
| |
| // Writes image matrix to a file. |
| void printImage(int height, int width, float arr[(2 + HEIGHT)][2 + WIDTH], |
| int dummy) { |
| std::ofstream myfile; |
| myfile.open("output.txt"); |
| for (int i = 0; i < height - 2; i++) { |
| for (int j = 0; j < width - 2; j++) { |
| if (arr[i][j] < 0) { |
| myfile << 0; |
| } else if (arr[i][j] > 255) { |
| myfile << 3; |
| } else { |
| myfile << (int)(arr[i][j]); |
| } |
| } |
| myfile << "\n"; |
| } |
| |
| // Dummy code to make sure the allocated ImageOutput Array is not optimized |
| // out |
| if (dummy > 0) { |
| myfile << sum; |
| } |
| } |
| |
| #ifdef BENCHMARK_LIB |
| void BENCHMARK_HARRIS(benchmark::State &state) { |
| int height = state.range(0); |
| int width = state.range(1); |
| |
| float(*image)[HEIGHT + 2][WIDTH + 2]; |
| image = (float(*)[2 + HEIGHT][2 + WIDTH]) |
| malloc(sizeof(float) * (2 + HEIGHT) * (2 + WIDTH)); |
| initCheckboardImage((HEIGHT + 2), (WIDTH + 2), *image); |
| |
| float(*imageOutput)[2 + HEIGHT][2 + WIDTH]; |
| imageOutput = (float(*)[2 + HEIGHT][2 + WIDTH]) |
| malloc(sizeof(float) * (2 + HEIGHT) * (2 + 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)[2 + HEIGHT][2 + WIDTH]; |
| float(*Sxy)[2 + HEIGHT][2 + WIDTH]; |
| float(*Syy)[2 + HEIGHT][2 + WIDTH]; |
| float(*det)[2 + HEIGHT][2 + WIDTH]; |
| float(*trace)[2 + HEIGHT][2 + WIDTH]; |
| |
| Ix = (float(*)[2 + HEIGHT][2 + WIDTH]) |
| malloc(sizeof(float) * (2 + HEIGHT) * (2 + WIDTH)); |
| Iy = (float(*)[2 + HEIGHT][2 + WIDTH]) |
| malloc(sizeof(float) * (2 + HEIGHT) * (2 + WIDTH)); |
| Ixx = (float(*)[2 + HEIGHT][2 + WIDTH]) |
| malloc(sizeof(float) * (2 + HEIGHT) * (2 + WIDTH)); |
| Ixy = (float(*)[2 + HEIGHT][2 + WIDTH]) |
| malloc(sizeof(float) * (2 + HEIGHT) * (2 + WIDTH)); |
| Iyy = (float(*)[2 + HEIGHT][2 + WIDTH]) |
| malloc(sizeof(float) * (2 + HEIGHT) * (2 + WIDTH)); |
| Sxx = (float(*)[2 + HEIGHT][2 + WIDTH]) |
| malloc(sizeof(float) * (2 + HEIGHT) * (2 + WIDTH)); |
| Sxy = (float(*)[2 + HEIGHT][2 + WIDTH]) |
| malloc(sizeof(float) * (2 + HEIGHT) * (2 + WIDTH)); |
| Syy = (float(*)[2 + HEIGHT][2 + WIDTH]) |
| malloc(sizeof(float) * (2 + HEIGHT) * (2 + WIDTH)); |
| det = (float(*)[2 + HEIGHT][2 + WIDTH]) |
| malloc(sizeof(float) * (2 + HEIGHT) * (2 + WIDTH)); |
| trace = (float(*)[2 + HEIGHT][2 + WIDTH]) |
| malloc(sizeof(float) * (2 + HEIGHT) * (2 + WIDTH)); |
| |
| harrisKernel(height, width, *image, *imageOutput, *Ix, *Iy, *Ixx, *Ixy, *Iyy, |
| *Sxx, *Sxy, *Syy, *det, *trace); |
| |
| for (auto _ : state) { |
| harrisKernel(height, width, *image, *imageOutput, *Ix, *Iy, *Ixx, *Ixy, |
| *Iyy, *Sxx, *Sxy, *Syy, *det, *trace); |
| } |
| |
| free((void *)Ix); |
| free((void *)Iy); |
| free((void *)Ixx); |
| free((void *)Ixy); |
| free((void *)Iyy); |
| free((void *)Sxx); |
| free((void *)Sxy); |
| free((void *)Syy); |
| free((void *)det); |
| free((void *)trace); |
| |
| for (int i = 0; i < height + 2; i++) { |
| for (int j = 0; j < width + 2; j++) { |
| sum = (sum + 1) & (int)(*imageOutput)[i][j]; |
| } |
| } |
| |
| state.SetBytesProcessed(sizeof(float) * (height + 2) * (width + 2) * |
| state.iterations()); |
| |
| free((void *)imageOutput); |
| free((void *)image); |
| } |
| BENCHMARK(BENCHMARK_HARRIS) |
| ->Args({256, 256}) |
| ->Args({512, 512}) |
| ->Args({1024, 1024}) |
| ->Args({2048, 2048}) |
| ->Unit(benchmark::kMicrosecond); |
| |
| #endif |
| |
| int main(int argc, char *argv[]) { |
| sum = 1; |
| #ifdef BENCHMARK_LIB |
| ::benchmark::Initialize(&argc, argv); |
| if (::benchmark::ReportUnrecognizedArguments(argc, argv)) |
| return 1; |
| ::benchmark::RunSpecifiedBenchmarks(); |
| #endif |
| |
| // Extra Call to verify output of kernel |
| float(*image)[HEIGHT + 2][WIDTH + 2]; |
| image = (float(*)[2 + HEIGHT][2 + WIDTH]) |
| malloc(sizeof(float) * (2 + HEIGHT) * (2 + WIDTH)); |
| initCheckboardImage((HEIGHT + 2), (WIDTH + 2), *image); |
| |
| float(*imageOutput)[2 + HEIGHT][2 + WIDTH]; |
| imageOutput = (float(*)[2 + HEIGHT][2 + WIDTH]) |
| malloc(sizeof(float) * (2 + HEIGHT) * (2 + 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)[2 + HEIGHT][2 + WIDTH]; |
| float(*Sxy)[2 + HEIGHT][2 + WIDTH]; |
| float(*Syy)[2 + HEIGHT][2 + WIDTH]; |
| float(*det)[2 + HEIGHT][2 + WIDTH]; |
| float(*trace)[2 + HEIGHT][2 + WIDTH]; |
| |
| Ix = (float(*)[2 + HEIGHT][2 + WIDTH]) |
| malloc(sizeof(float) * (2 + HEIGHT) * (2 + WIDTH)); |
| Iy = (float(*)[2 + HEIGHT][2 + WIDTH]) |
| malloc(sizeof(float) * (2 + HEIGHT) * (2 + WIDTH)); |
| Ixx = (float(*)[2 + HEIGHT][2 + WIDTH]) |
| malloc(sizeof(float) * (2 + HEIGHT) * (2 + WIDTH)); |
| Ixy = (float(*)[2 + HEIGHT][2 + WIDTH]) |
| malloc(sizeof(float) * (2 + HEIGHT) * (2 + WIDTH)); |
| Iyy = (float(*)[2 + HEIGHT][2 + WIDTH]) |
| malloc(sizeof(float) * (2 + HEIGHT) * (2 + WIDTH)); |
| Sxx = (float(*)[2 + HEIGHT][2 + WIDTH]) |
| malloc(sizeof(float) * (2 + HEIGHT) * (2 + WIDTH)); |
| Sxy = (float(*)[2 + HEIGHT][2 + WIDTH]) |
| malloc(sizeof(float) * (2 + HEIGHT) * (2 + WIDTH)); |
| Syy = (float(*)[2 + HEIGHT][2 + WIDTH]) |
| malloc(sizeof(float) * (2 + HEIGHT) * (2 + WIDTH)); |
| det = (float(*)[2 + HEIGHT][2 + WIDTH]) |
| malloc(sizeof(float) * (2 + HEIGHT) * (2 + WIDTH)); |
| trace = (float(*)[2 + HEIGHT][2 + WIDTH]) |
| malloc(sizeof(float) * (2 + HEIGHT) * (2 + WIDTH)); |
| |
| harrisKernel(HEIGHT, WIDTH, *image, *imageOutput, *Ix, *Iy, *Ixx, *Ixy, *Iyy, |
| *Sxx, *Sxy, *Syy, *det, *trace); |
| |
| free((void *)Ix); |
| free((void *)Iy); |
| free((void *)Ixx); |
| free((void *)Ixy); |
| free((void *)Iyy); |
| free((void *)Sxx); |
| free((void *)Sxy); |
| free((void *)Syy); |
| free((void *)det); |
| free((void *)trace); |
| |
| if (argc == 2) { |
| printImage(HEIGHT + 2, WIDTH + 2, *imageOutput, sum); |
| } else { |
| printImage(HEIGHT + 2, WIDTH + 2, *imageOutput, -1); |
| } |
| |
| free((void *)image); |
| free((void *)imageOutput); |
| return 0; |
| } |