using AOI;
using OpenCvSharp;
using OpenCvSharp.Blob;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net.Http.Headers;
using System.Security.Cryptography;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using static System.Net.Mime.MediaTypeNames;
using static System.Windows.Forms.MonthCalendar;

namespace 园晶斑点分析测试
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            this.WindowState = FormWindowState.Minimized;
            var src = System.Drawing.Image.FromFile("d:\\logs\\t10_2.jpg");
            var src2 = System.Drawing.Image.FromFile("d:\\logs\\t10.jpg");
            
            //var src = System.Drawing.Image.FromFile("d:\\hbyj.png");
            //var bck = System.Drawing.Image.FromFile("d:\\blank.png");
            Mat srcMat = ImageUtil.ToMat(src);
            //Cv2.Resize(srcMat, srcMat, new OpenCvSharp.Size(src.Width / 3, src.Height / 3), 0, 0, InterpolationFlags.Area);
            Mat srcMat2 = ImageUtil.ToMat(src2);
            //Cv2.Resize(srcMat2, srcMat2, new OpenCvSharp.Size(src.Width / 3, src.Height / 3), 0, 0, InterpolationFlags.Area);
            // Mat bckMat = ImageUtil.ToMat(bck);
            Mat threshMat = new Mat();
            Cv2.CvtColor(srcMat, threshMat, ColorConversionCodes.RGB2GRAY);
            ThresholdTypes threshType = ThresholdTypes.Binary;
            
            Cv2.Threshold(threshMat, threshMat, 120, 255, threshType);
            
            Cv2.GaussianBlur(threshMat, threshMat,  new OpenCvSharp.Size(5, 5),0);
            Cv2.AddWeighted(threshMat, 1.5, threshMat, -0.5, 0, threshMat);
            //Cv2.Threshold(threshMat, threshMat, 60, 255, threshType);
            //Cv2.ImShow("ddd", threshMat);
            Cv2.CvtColor(srcMat2, srcMat2, ColorConversionCodes.RGB2GRAY);

            srcMat2 = HighPassFilter(srcMat2, 5, 6, 10);
            Cv2.Threshold(srcMat2, srcMat2, 140, 255, threshType);
            Cv2.GaussianBlur(srcMat2, srcMat2, new OpenCvSharp.Size(3, 3), 200);
            Cv2.GaussianBlur(srcMat2, srcMat2, new OpenCvSharp.Size(3, 3), 200);
            Cv2.Threshold(srcMat2, srcMat2, 30, 255, threshType);
            Cv2.ImShow("www", srcMat2);
            return;
            //CvBlobs blobs = new CvBlobs();
            ////blobs.FilterByArea(200, 255);

            //blobs.Label(threshMat);
            //var blobList = blobs.Values.ToList();
            ////Mat im_with_keypoints = ImageUtil.ToMat(bck);

            //foreach (var pair in blobList)
            //{
            //    CvBlob blob = pair;
            //    Cv2.Circle(srcMat, (int)blob.Centroid.X, (int)blob.Centroid.Y, 1, Scalar.FromRgb(255, 0, 0), 1);
            //}

            //Cv2.ImShow("ccc", srcMat);
            ////return;


            var cparams = new SimpleBlobDetector.Params();
            cparams.ThresholdStep = 2;
            cparams.FilterByColor = true;
            cparams.BlobColor = 255;
            cparams.MinRepeatability = 8;
            cparams.MinDistBetweenBlobs = 10;
            // 改变阈值
            cparams.MinThreshold = 40;
            cparams.MaxThreshold = 255;
            // 通过面积滤波
            cparams.FilterByArea = true;
            cparams.MinArea = 0.1f;
            // 通过圆度滤波
            //cparams.FilterByCircularity = true;
            //cparams.MinCircularity = 0.1f;
            // 通过凸度滤波
            cparams.FilterByConvexity = true;
            cparams.MinConvexity = 0.5f;
            // 通过惯性比滤波
            //cparams.FilterByInertia = true;
            //cparams.MinInertiaRatio = 0.01f;

            Mat mask = new Mat(threshMat.Size(),MatType.CV_8U,1);
            mask.SetTo(new Scalar(0));
            Cv2.Rectangle(mask,new Rect(1064,152,1356,2424), new Scalar(255), -1);

            SimpleBlobDetector simpleBlob = SimpleBlobDetector.Create(cparams);
            var keypoints = simpleBlob.Detect(threshMat, mask);
            ////Mat im_with_keypoints = new Mat();
            //Cv2.CvtColor(threshMat, im_with_keypoints, ColorConversionCodes.GRAY2RGB);
            
            Cv2.DrawKeypoints(threshMat, keypoints, srcMat2, Scalar.FromRgb(255, 0, 0), DrawMatchesFlags.DrawOverOutImg);
            Cv2.PutText(srcMat2, $"{keypoints.Length}", new OpenCvSharp.Point(1064, 152), HersheyFonts.HersheySimplex, 4, Scalar.Red,4);
            Cv2.ImShow("bbb", srcMat2);
            Cv2.ImWrite("d:\\logs\\t10_result.jpg",srcMat2);
            //var dstCutImg = ImageUtil.ToImage(threshMat);
        }

        static Mat HighPassFilter(Mat src, int ksize, double sigma, double contrast)
        {
            Mat dst = new Mat();
            Mat kernel = Cv2.GetGaussianKernel(ksize, sigma);
            kernel *= contrast;
            kernel.Set<double>(ksize / 2, ksize / 2, kernel.At<double>(ksize / 2, ksize / 2) - contrast + 1);
            Cv2.Filter2D(src, dst, -1, kernel);
            return dst;
        }
    }
}