#include <iostream>
#include "opencv2/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"

int DELAY_CAPTION = 1500;
int DELAY_BLUR = 500;
int MAX_KERNEL_LENGTH = 31;

cv::Mat src; cv::Mat dst;
char window_name[] = "Smoothing Demo";
//显示图像
int display_dst( int delay )
{
    cv::imshow( window_name, dst );
    int c = cv::waitKey ( delay );
    if( c >= 0 ) { return -1; }
    return 0;
}
//显示标题
int display_caption( const char* caption )
{
    dst = cv::Mat::zeros( src.size(), src.type() );
    putText( dst, caption,
             cv::Point( src.cols/4, src.rows/2),
             cv::FONT_HERSHEY_COMPLEX, 1, cv::Scalar(255, 255, 255) );
    return display_dst(DELAY_CAPTION);
}

int main(){
    src = cv::imread("./src/cv_test/Gray_Image.jpg");
    src.convertTo(src, CV_8UC1);
    if (src.empty())
    {
        std::cout << "empty image" << std::endl;
        return -1;
    }
    cv::namedWindow("origin image", cv::WINDOW_KEEPRATIO);
    cv::imshow("origin image",src);

    { //smoothing
        // if (display_caption("Original Image") != 0)
        // {
        //     return 0;
        // }
        // dst = src.clone();
        // if (display_dst(DELAY_CAPTION) != 0)
        // {
        //     return 0;
        // }
        // if (display_caption("Homogeneous Blur") != 0)
        // {
        //     return 0;
        // }
        // for (int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2)
        // {
        //     blur(src, dst, cv::Size(i, i), cv::Point(-1, -1));
        //     if (display_dst(DELAY_BLUR) != 0)
        //     {
        //         return 0;
        //     }
        // }
        // if (display_caption("Gaussian Blur") != 0)
        // {
        //     return 0;
        // }
        // for (int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2)
        // {
        //     GaussianBlur(src, dst, cv::Size(i, i), 0, 0);
        //     if (display_dst(DELAY_BLUR) != 0)
        //     {
        //         return 0;
        //     }
        // }
        // if (display_caption("Median Blur") != 0)
        // {
        //     return 0;
        // }
        // for (int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2)
        // {
        //     medianBlur(src, dst, i);
        //     if (display_dst(DELAY_BLUR) != 0)
        //     {
        //         return 0;
        //     }
        // }
        // if (display_caption("Bilateral Blur") != 0)
        // {
        //     return 0;
        // }
        // for (int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2)
        // {
        //     bilateralFilter(src, dst, i, i * 2, i / 2);
        //     if (display_dst(DELAY_BLUR) != 0)
        //     {
        //         return 0;
        //     }
        // }
        // display_caption("Done!");
    }

    { //erosion(min) and dilation(max), createTrackBar(...)
        // cv::Mat element = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(3,3), cv::Point(1,1));
        // cv::Mat eroMat, dilMat, openMat, closeMat, gradiMat, tHatMat, bHatMat;
        // cv::erode(src, eroMat, element);
        // cv::dilate(src, dilMat, element);
        // // cv::imshow("erosion",eroMat);
        // // cv::imshow("dilation",dilMat);

        // //open(erode->dilate, remove lights), close(dialate->erode, remove holes), Morphological Gradient(dilate-erode), tophat(src-open), blackhat(close-src)
        // cv::morphologyEx(src, openMat, 2, element);
        // cv::morphologyEx(src, closeMat, 3, element);
        // cv::morphologyEx(src, gradiMat, 4, element);
        // cv::morphologyEx(src, tHatMat, 5, element);
        // cv::morphologyEx(src, bHatMat, 6, element);
        // imshow("open",openMat);
        // imshow("close",closeMat);
        // imshow("morph gradient",gradiMat);
        // imshow("top hat",tHatMat);
        // imshow("black hat",bHatMat);


    }

    { //pyramid
        // cv::Mat origin = src.clone();
        // cv::pyrDown(origin, origin, cv::Size(origin.cols/2, origin.rows/2));
        // cv::imshow("down sampling",origin);
        // cv::pyrUp(origin, origin, cv::Size(origin.cols*2, origin.rows*2));
        // cv::imshow("up sampling", origin);
    }

    { //threshold, binary(threshold), binary_inv, truncate(set max to threshold), tozero(delete those less than threshold), tozero_inv
        // cv::Mat output1;
        // cv::threshold(src, output1, 100, 255, cv::ThresholdTypes::THRESH_TOZERO_INV );
        // cv::imshow("threshold",output1);
    }

    { //

    }

    cv::waitKey();
    return 0;
}