int main()
{

	//place to hold images
	cv::Mat image1, image2;

	//place to hold color-coded output image;
	cv::Mat flow_img;
		
	//int search_size[] = { 32, 32, 42 }; //params for block matching
	//int block_size[] = { 16, 16, 32 };
	//int num_levels = 3;

	int search_size[] = { 64, 64, 64, 64 }; //searchsizes for middlebury most recent -- interpolation factor of 4 -- 4 levels of hierarchy instead of 3 -- smaller block sizes
	int block_size[] = { 32, 32, 32, 32 };
	int num_levels = 4;
	
	//read first image
	image1 = cv::imread(".\\middlebury\\data-gray\\Dimetrodon\\frame10.png", 0);
	//read second image
	image2 = cv::imread(".\\middlebury\\data-gray\\Dimetrodon\\frame11.png", 0);

	int orig_height = image1.rows;
	int orig_width = image1.cols;

	//Need to interpolate by a factor of 4.  
	cv::resize(image1, image1, cv::Size(), 4, 4, cv::INTER_LINEAR);
	cv::resize(image2, image2, cv::Size(), 4, 4, cv::INTER_LINEAR);
					
	/*int biggest_height = image1.rows;
	int biggest_width = image1.cols;*/

	if (!image1.data || !image2.data)
	{
		std::cout << "Could not open one of the images" << std::endl;
		getchar();
		exit(1);
	}

	MF motion_pair(image1, image2, search_size, block_size, num_levels);

	clock_t t1, t2;
	t1 = clock();

    cv::Mat flow_res = motion_pair.calcMotionBlockMatching();	

	t2 = clock();
	float diff = ((float)t2 - (float)t1);
	float seconds = diff / CLOCKS_PER_SEC;
	std::cout << "Seconds: " << seconds << std::endl;

	//Need to divide all MVs by a factor of 4.  
	cv::Mat subpix_MVs(orig_height, orig_width, CV_32FC2);
    int pad_y = motion_pair.padding_y;
    int pad_x = motion_pair.padding_x;
    int biggest_height = motion_pair.padded_height;
    int biggest_width = motion_pair.padded_width;
	for (int i = pad_y; i < biggest_height-pad_y; i+=4)
	{
		for (int j = pad_x; j < biggest_width-pad_x; j+=4)
		{
			subpix_MVs.at<cv::Vec2f>((i - pad_y) / 4, (j - pad_x) / 4)[0] = flow_res.at<cv::Vec2f>(i, j)[0] / 4;
			subpix_MVs.at<cv::Vec2f>((i - pad_y) / 4, (j - pad_x) / 4)[1] = flow_res.at<cv::Vec2f>(i, j)[1] / 4;
		}
	}

	//Draw a color-coded image for the motion vectors
	Flow file;
	file.MotionToColor(subpix_MVs, flow_img, -1); //the last parameter is if you want to set a maximum motion vector value.  Any value < 0 ignores this option
	cv::imwrite("flow.png", flow_img);

	//Calculate Mean-square error for our calculated MV field and the ground truth motion vector field (.flo file provided by Middlebury)
	cv::Mat gtruth;
	file.ReadFlowFile(gtruth, ".\\middlebury\\gt-flow\\Dimetrodon\\flow10.flo");
	double MSE = file.CalculateMSE(gtruth, subpix_MVs);

	std::cout << "Calculated MSE is " << MSE << std::endl;

	return 0;
}