#include <string.h>
#include <stdio.h>
#include <math.h>
#include <algorithm>
{
        
    float dx_kernel[] = { -1.0f / 6.0f, -1.0f / 6.0f, -1.0f / 6.0f,
        0.0f / 6.0f,  0.0f / 6.0f,  0.0f / 6.0f,
        1.0f / 6.0f,  1.0f / 6.0f,  1.0f / 6.0f
    };
    float dy_kernel[] = { -1.0f / 6.0f,  0.0f / 6.0f,  1.0f / 6.0f,
        -1.0f / 6.0f,  0.0f / 6.0f,  1.0f / 6.0f,
        -1.0f / 6.0f,  0.0f / 6.0f,  1.0f / 6.0f
    };
}
static void optical_flow_demo(bool console)
{
    double time_total = 10; 
    const float h_mean_kernel[] = {1.0f / 12.0f, 2.0f / 12.0f, 1.0f / 12.0f,
        2.0f / 12.0f,        0.0f,  2.0f / 12.0f,
        1.0f / 12.0f, 2.0f / 12.0f, 1.1f / 12.0f
    };
    array I2 = 
loadImage(ASSETS_DIR 
"/examples/images/circle_center.ppm");
     array Ix, Iy, It; diffs(Ix, Iy, It, I1, I2);
     timer time_start, time_last;
     int iter = 0, iter_last = 0;
    double max_rate = 0;
    while (true) {
        iter++;
        const float alphasq = 0.1f;
        array num = Ix * u_ + Iy * v_ + It;
         array den = alphasq + Ix * Ix + Iy * Iy;
         u = u_ - (Ix * tmp) / den;
        v = v_ - (Iy * tmp) / den;
        if (!console) {
            wnd(0, 0).
image(I1, 
"I1");
            wnd(1, 0).
image(I2, 
"I2");
        }
        if (elapsed > 1) {
            double rate = (iter - iter_last) / elapsed;
            iter_last = iter;
            if (total_elapsed >= time_total) {
                break;
            }
            if (!console)
                printf("  iterations per second: %.0f   (progress %.0f%%)\n",
                        rate, 100.0f * total_elapsed / time_total);
        }
    }
    if (console) {
        printf(" ### optical_flow %f iterations per second (max)\n", max_rate);
    }
}
int main(int argc, char* argv[])
{
    int device = argc > 1 ? atoi(argv[1]) : 0;
    bool console = argc > 2 ? argv[2][0] == '-' : false;
    try {
        printf("Horn-Schunck optical flow\n");
        optical_flow_demo(console);
        fprintf(stderr, 
"%s\n", e.
what());
        throw;
    }
    return 0;
}