public static double CalcSimilarDegree(string filePathOrigin, string filePathTemp)
        {
            Mat    mat1;
            Mat    mat2;
            Mat    mat11       = new Mat();
            Mat    mat22       = new Mat();
            Image  originImage = Image.FromFile(filePathOrigin);
            Image  tempImage   = Image.FromFile(filePathTemp);
            Bitmap bitmap1     = new Bitmap(originImage);
            Bitmap bitmap2     = new Bitmap(tempImage);

            originImage.Dispose();
            tempImage.Dispose();
            if (bitmap1.Width > bitmap2.Width && bitmap1.Height > bitmap2.Height)
            {
                bitmap1 = new Bitmap(ZoomPicture(bitmap1, bitmap2.Width, bitmap2.Height));
            }
            else
            {
                bitmap2 = new Bitmap(ZoomPicture(bitmap2, bitmap1.Width, bitmap1.Height));
            }
            mat1 = bitmap1.ToMat();
            mat2 = bitmap2.ToMat();
            Cv2.CvtColor(mat1, mat11, ColorConversionCodes.BGR2GRAY);
            Cv2.CvtColor(mat2, mat22, ColorConversionCodes.BGR2GRAY);
            mat11.ConvertTo(mat11, MatType.CV_32F);
            mat22.ConvertTo(mat22, MatType.CV_32F);
            double score = Cv2.CompareHist(mat11, mat22, HistCompMethods.Correl) * 100;

            return(score);
        }
    private void CompareHistogramWithStepImage(Mat _removeBackgorundImage)
    {
        _removeBackgorundImage.ConvertTo(_removeBackgorundImage, MatType.CV_32F);
        Cv2.Normalize(_removeBackgorundImage,
                      openCVImage.stepImage[currentStep]); // , 1.0, 0.0, NormTypes.L1

        compareValue = Cv2.CompareHist(openCVImage.stepImage[currentStep],
                                       _removeBackgorundImage, HistCompMethods.Chisqr);
    }
Exemple #3
0
        static double Compare(string str1, string str2, HistCompMethods method)
        {
            Mat mat1  = new Mat(str1, ImreadModes.AnyColor);
            Mat mat2  = new Mat(@str1, ImreadModes.AnyColor);
            Mat mat3  = new Mat();
            var value = Cv2.CompareHist(mat1, mat2, method);

            Console.WriteLine(new FileInfo(str1).Name + "-" + new FileInfo(str2).Name + ":" + value);
            return(value);
        }
Exemple #4
0
        public double[] CompareHist(Mat img, Mat template, bool showImage = false)
        {
            Mat[] imgs      = HistogramCalculation(img, showImage);
            Mat[] templates = HistogramCalculation(template, showImage);

            double[] ratios = new double[3];
            for (int i = 0; i < imgs.Count(); i++)
            {
                ratios[i] = Cv2.CompareHist(imgs[i], templates[i], HistCompMethods.Bhattacharyya);
            }

            return(ratios);
        }
    private void CompareHistogram(Mat _dstImage, int step)
    {
        _dstImageBuffer         = _dstImage.Clone();
        stepImageBufferOfBuffer = stepImageBuffer[step].Clone();

        _dstImageBuffer.ConvertTo(_dstImageBuffer, MatType.CV_32F);
        stepImageBufferOfBuffer.ConvertTo(stepImageBufferOfBuffer, MatType.CV_32F);

        Cv2.Normalize(_dstImageBuffer, stepImageBufferOfBuffer);

        openCVImage.stepHist[step] = Cv2.CompareHist(stepImageBufferOfBuffer,
                                                     _dstImageBuffer, HistCompMethods.Chisqr);
    }
Exemple #6
0
        public double CompareImageByHist(Mat img, Mat refImg, bool showImage = false)
        {
            Mat imgHsv    = new Mat();
            Mat refImgHsv = new Mat();

            Cv2.CvtColor(img, imgHsv, ColorConversionCodes.RGB2HSV);
            Cv2.CvtColor(refImg, refImgHsv, ColorConversionCodes.RGB2HSV);

            Mat[] imgHsvs    = Cv2.Split(imgHsv);
            Mat[] refImgHsvs = Cv2.Split(refImgHsv);

            int bin1 = 50;
            int bin2 = 60;

            int[] bins = { bin1, bin2 };

            int[] channels = { 0, 1 };

            Rangef[] ranges = new Rangef[]
            {
                new Rangef(0, 180),
                new Rangef(0, 256)
            };

            Mat imgHist    = new Mat(img.Size(), MatType.CV_32FC2);
            Mat refImgHist = new Mat(img.Size(), MatType.CV_32FC2);

            Cv2.CalcHist(imgHsvs, channels, new Mat(), imgHist, 2, bins, ranges, true, false);
            Cv2.Normalize(imgHist, imgHist, 1, 0, NormTypes.MinMax, -1, null);

            Cv2.CalcHist(refImgHsvs, channels, new Mat(), refImgHist, 2, bins, ranges, true, false);
            Cv2.Normalize(refImgHist, refImgHist, 1, 0, NormTypes.MinMax, -1, null);

            double ratio = Cv2.CompareHist(imgHist, refImgHist, HistCompMethods.KLDiv);

            if (showImage == true)
            {
                Mat img1 = img.Clone();
                Cv2.PutText(img1, ratio.ToString(), new Point(50, 50), HersheyFonts.HersheyPlain, 1, new Scalar(0, 255, 0), 2, LineTypes.AntiAlias);
                Cv2.ImShow("CompareHistTestVSRef", img1);
                Cv2.WaitKey();
                Cv2.DestroyWindow("CompareHistTestVSRef");
            }
            return(ratio);
        }
        SquareClassificationScores[,] CalcSquareClassifications(Mat frame)
        {
            var result     = new SquareClassificationScores[8, 8];
            Mat squareMask = new Mat(frame.Size(), MatType.CV_8U);
            var histSize   = new[] { 16, 16, 16 };
            var histRanges = new[] { new Rangef(0f, 256f), new Rangef(0f, 256f), new Rangef(0f, 256f) };

            for (int row = 0; row < 8; row++)
            {
                for (int col = 0; col < 8; col++)
                {
                    squareMask.SetTo(Scalar.Black);
                    _histChessboardModel.DrawSquareMask(row, col, squareMask, HistChessboardModel.SquareMaskScale);
                    Mat squareHist = new Mat();
                    Cv2.CalcHist(
                        images: new[] { frame },
                        channels: new int[] { 0, 1, 2 },
                        mask: squareMask,
                        hist: squareHist,
                        dims: 3,
                        histSize: histSize,
                        ranges: histRanges);

                    var method         = HistCompMethods.Correl;
                    var squareColor    = HistChessboardModel.SquareColor(row, col);
                    var likeWhitePiece = Cv2.CompareHist(
                        h1: squareHist,
                        h2: _histChessboardModel.XOnYHist[(int)ChessColor.White, squareColor],
                        method: method);
                    var likeBlackPiece = Cv2.CompareHist(
                        h1: squareHist,
                        h2: _histChessboardModel.XOnYHist[(int)ChessColor.Black, squareColor],
                        method: method);
                    var likeEmpty = Cv2.CompareHist(
                        h1: squareHist,
                        h2: _histChessboardModel.XOnYHist[(int)SquareState.Empty, squareColor],
                        method: method);
                    result[row, col] = new SquareClassificationScores(new [] { likeWhitePiece, likeBlackPiece, likeEmpty });
                }
            }
            return(result);
        }
Exemple #8
0
        /// <summary>
        /// 通过直方图比较
        /// </summary>
        /// <param name="sourceImage"></param>
        /// <param name="targetImage"></param>
        /// <param name="method"></param>
        /// <returns></returns>
        public static double CompareImageByHistogram(string sourceImage, string targetImage, HistCompMethods method = HistCompMethods.KLDiv)
        {
            using (Mat source = new Mat(sourceImage, ImreadModes.AnyColor | ImreadModes.AnyDepth))
                using (Mat target = new Mat(targetImage, ImreadModes.AnyColor | ImreadModes.AnyDepth))
                {
                    //1:从BGR空间转换到HSV色彩空间
                    Mat src1HSV = new Mat();
                    Mat src2HSV = new Mat();

                    Cv2.CvtColor(source, src1HSV, ColorConversionCodes.BGR2HSV);
                    Cv2.CvtColor(target, src2HSV, ColorConversionCodes.BGR2HSV);
                    //Mat[] mats = new Mat[] { baseHSV, src1HSV, src2HSV };

                    Mat[] mats2 = Cv2.Split(src1HSV);
                    Mat[] mats3 = Cv2.Split(src2HSV);

                    //计算直方图并归一化数据
                    int      bin1     = 50;          //灰度等级
                    int      bin2     = 60;          //灰度等级
                    int[]    histSiz  = { bin1, bin2 };
                    int[]    channels = { 0, 1 };    //图像通道数
                    Rangef[] rangefs  = new Rangef[] //梯度值范围
                    {
                        new Rangef(0, 180),
                        new Rangef(0, 256)
                    };

                    Mat Img2 = new Mat(source.Size(), MatType.CV_32FC2);
                    Mat Img3 = new Mat(target.Size(), MatType.CV_32FC2);

                    Cv2.CalcHist(mats2, channels, new Mat(), Img2, 2, histSiz, rangefs, true, false);
                    Cv2.Normalize(Img2, Img2, 0, 1, NormTypes.MinMax, -1, null);

                    Cv2.CalcHist(mats3, channels, new Mat(), Img3, 2, histSiz, rangefs, true, false);
                    Cv2.Normalize(Img3, Img3, 0, 1, NormTypes.MinMax, -1, null);

                    //比较直方图
                    double s1coms2 = Cv2.CompareHist(Img2, Img3, method);
                    return(s1coms2);
                }
        }
Exemple #9
0
        public void matchTestCompareHist()
        {
            Mat img       = new Mat(Images.picTest, ImreadModes.Color);
            Mat refImg    = new Mat(Images.picSetRef, ImreadModes.Color);
            Mat imgHsv    = new Mat();
            Mat refImgHsv = new Mat();

            Cv2.CvtColor(img, imgHsv, ColorConversionCodes.RGB2HSV);
            Cv2.CvtColor(refImg, refImgHsv, ColorConversionCodes.RGB2HSV);

            Mat[] imgHsvs    = Cv2.Split(imgHsv);
            Mat[] refImgHsvs = Cv2.Split(refImgHsv);

            int bin1 = 50;
            int bin2 = 60;

            int[] bins = { bin1, bin2 };

            int[] channels = { 0, 1 };


            Rangef[] ranges = new Rangef[]
            {
                new Rangef(0, 180),
                new Rangef(0, 256)
            };

            Mat imgHist    = new Mat(img.Size(), MatType.CV_32FC2);
            Mat refImgHist = new Mat(img.Size(), MatType.CV_32FC2);

            Cv2.CalcHist(imgHsvs, channels, new Mat(), imgHist, 2, bins, ranges, true, false);
            Cv2.Normalize(imgHist, imgHist, 1, 0, NormTypes.MinMax, -1, null);

            Cv2.CalcHist(refImgHsvs, channels, new Mat(), refImgHist, 2, bins, ranges, true, false);
            Cv2.Normalize(refImgHist, refImgHist, 1, 0, NormTypes.MinMax, -1, null);



            double ratio = Cv2.CompareHist(refImgHist, imgHist, HistCompMethods.Bhattacharyya);
        }
        public decimal Compare(Mat first, Mat second)
        {
            var result = Cv2.CompareHist(first, second, HistCompMethods.Chisqr);

            return((decimal)Math.Round(result, 2));
        }
Exemple #11
0
        private static void HistogarmToComparison(string path1, string path2, string path3)
        {
            using (Mat baseMat = new Mat(path1, ImreadModes.AnyColor | ImreadModes.AnyDepth))
                using (Mat src1 = new Mat(path2, ImreadModes.AnyColor | ImreadModes.AnyDepth))
                    using (Mat src2 = new Mat(path3, ImreadModes.AnyColor | ImreadModes.AnyDepth))
                    {
                        //1:从BGR空间转换到HSV色彩空间


                        Mat baseHSV = new Mat();
                        Mat src1HSV = new Mat();
                        Mat src2HSV = new Mat();


                        Cv2.CvtColor(baseMat, baseHSV, ColorConversionCodes.BGR2HSV);
                        Cv2.CvtColor(src1, src1HSV, ColorConversionCodes.BGR2HSV);
                        Cv2.CvtColor(src2, src2HSV, ColorConversionCodes.BGR2HSV);
                        //Mat[] mats = new Mat[] { baseHSV, src1HSV, src2HSV };
                        Mat[] mats1 = Cv2.Split(baseHSV);
                        Mat[] mats2 = Cv2.Split(src1HSV);
                        Mat[] mats3 = Cv2.Split(src2HSV);

                        //计算直方图并归一化数据

                        int   bin1    = 50; //灰度等级
                        int   bin2    = 60; //灰度等级
                        int[] histSiz = { bin1, bin2 };

                        int[]    channels = { 0, 1 };    //图像通道数
                        Rangef[] rangefs  = new Rangef[] //梯度值范围
                        {
                            new Rangef(0, 180),
                            new Rangef(0, 256)
                        };

                        Mat             Img1   = new Mat(baseMat.Size(), MatType.CV_32FC2);
                        Mat             Img2   = new Mat(src1.Size(), MatType.CV_32FC2);
                        Mat             Img3   = new Mat(src2.Size(), MatType.CV_32FC2);
                        HistCompMethods method = HistCompMethods.KLDiv;


                        Cv2.CalcHist(mats1, channels, new Mat(), Img1, 2, histSiz, rangefs, true, false);
                        Cv2.Normalize(Img1, Img1, 0, 1, NormTypes.MinMax, -1, null);

                        Cv2.CalcHist(mats2, channels, new Mat(), Img2, 2, histSiz, rangefs, true, false);
                        Cv2.Normalize(Img2, Img2, 0, 1, NormTypes.MinMax, -1, null);

                        Cv2.CalcHist(mats3, channels, new Mat(), Img3, 2, histSiz, rangefs, true, false);
                        Cv2.Normalize(Img3, Img3, 0, 1, NormTypes.MinMax, -1, null);

                        //比较直方图
                        double bcomb   = Cv2.CompareHist(Img1, Img1, method);
                        double s1coms2 = Cv2.CompareHist(Img2, Img3, method);
                        double bcoms1  = Cv2.CompareHist(Img1, Img2, method);
                        double bcoms2  = Cv2.CompareHist(Img1, Img3, method);

                        Mat mats1Ands2 = new Mat();
                        src2.CopyTo(mats1Ands2);

                        Cv2.PutText(baseMat, bcomb.ToString(), new Point(30, 30), HersheyFonts.HersheyComplex, 1, new Scalar(0, 255, 0), 2, LineTypes.AntiAlias);

                        Cv2.PutText(src1, bcoms1.ToString(), new Point(30, 30), HersheyFonts.HersheyComplex, 1, new Scalar(0, 255, 0), 2, LineTypes.AntiAlias);

                        Cv2.PutText(src2, bcoms2.ToString(), new Point(30, 30), HersheyFonts.HersheyComplex, 1, new Scalar(0, 255, 0), 2, LineTypes.AntiAlias);

                        Cv2.PutText(mats1Ands2, s1coms2.ToString(), new Point(30, 30), HersheyFonts.HersheyComplex, 1, new Scalar(0, 255, 0), 2, LineTypes.AntiAlias);

                        using (new Window("Img1 :Img1", WindowMode.Normal, baseMat))
                            using (new Window("Img1 :Img2", WindowMode.Normal, src1))
                                using (new Window("Img1 :Img3", WindowMode.Normal, src2))
                                {
                                    Cv2.WaitKey(0);
                                }
                    }
        }
        public static bool IsUnique(Mat face)
        {
            if (_faces.Count == 0)
            {
                var color1 = ColorsExtractor.ExtractMiddleColor(face);
                color1 = ColorsExtractor.ClosestColorRgb(color1);

                _faces.Add(face);
                _facesMiddleColors.Add(color1);
                return(true);
            }

            /// Using 50 bins for hue and 60 for saturation
            int h_bins = 50;
            int s_bins = 60;

            int[] histSize = new int[2] {
                h_bins, s_bins
            };

            // hue varies from 0 to 179, saturation from 0 to 255
            var h_ranges = new Rangef(0, 180);
            var s_ranges = new Rangef(0, 256);

            var ranges = new Rangef[] { h_ranges, s_ranges };

            // Use the o-th and 1-st channels
            int[] channels = new int[2] {
                0, 1
            };

            var faceHsv = face.CvtColor(ColorConversionCodes.BGR2HSV);

            var faceHistogram = new Mat();

            Cv2.CalcHist(new Mat[] { faceHsv }, channels, new Mat(), faceHistogram, 2, histSize, ranges, true, false);
            Cv2.Normalize(faceHistogram, faceHistogram, 0, 1, NormTypes.MinMax, -1, new Mat());

            var color = ColorsExtractor.ExtractMiddleColor(face);

            foreach (var f in _faces)
            {
                var fHsv = f.CvtColor(ColorConversionCodes.BGR2HSV);

                var fHistogram = new Mat();
                Cv2.CalcHist(new Mat[] { fHsv }, channels, new Mat(), fHistogram, 2, histSize, ranges, true, false);
                Cv2.Normalize(fHistogram, fHistogram, 0, 1, NormTypes.MinMax, -1, new Mat());

                double correl = Cv2.CompareHist(faceHistogram, fHistogram, HistCompMethods.Correl);

                //if (correl > 0.5) return false;
                bool contains = _facesMiddleColors.Contains(color);
                if (correl > 0.4 && contains)
                {
                    return(false);
                }
                //if (correl > 0.65) return false;
            }

            color = ColorsExtractor.ExtractMiddleColor(face);

            _faces.Add(face);
            _facesMiddleColors.Add(color);
            return(true);
        }
Exemple #13
0
        private void Analyze()
        {
            ArrayList position = CountImage();
            int       length   = position.Count;

            Mat[] srcImage  = new Mat[length];
            Mat[] hsvImage  = new Mat[length];
            Mat[] histogram = new Mat[length];

            Mat originSrcImage  = new Mat(mOriginImageURL);
            Mat originHsvImage  = new Mat();
            Mat originHistogram = new Mat();

            for (int i = 0; i < length; i++)
            {
                srcImage[i] = new Mat(mSimilarImage[(int)position[i]].URL);
                hsvImage[i] = new Mat();
                Cv2.CvtColor(srcImage[i], hsvImage[i], ColorConversionCodes.BGR2HSV);
            }
            Cv2.CvtColor(originSrcImage, originHsvImage, ColorConversionCodes.BGR2HSV);

            int hBins = 50;
            int sBins = 60;

            int[]    histSize = { hBins, sBins };
            Rangef[] ranges   = { new Rangef(0, 180), new Rangef(0, 256) };
            int[]    channels = { 0, 1 };

            for (int i = 0; i < length; i++)
            {
                histogram[i] = new Mat();
                Cv2.CalcHist(
                    images: new[] { hsvImage[i] },
                    channels: channels,
                    mask: null,
                    hist: histogram[i],
                    dims: 1,
                    histSize: histSize,
                    ranges: ranges);
                Cv2.Normalize(histogram[i], histogram[i], 0, 1, NormTypes.MinMax);
            }
            Cv2.CalcHist(
                images: new[] { originHsvImage },
                channels: channels,
                mask: null,
                hist: originHistogram,
                dims: 1,
                histSize: histSize,
                ranges: ranges);
            Cv2.Normalize(originHistogram, originHistogram, 0, 1, NormTypes.MinMax);

            double maxValue = 0;
            int    maxID    = 0;

            for (int i = 0; i < length; i++)
            {
                double bass = Cv2.CompareHist(originHistogram, histogram[i], HistCompMethods.Correl);
                if (bass < 0)
                {
                    bass = 0;
                }

                if (i == 0)
                {
                    maxValue = bass;
                    maxID    = 0;
                }
                else
                {
                    if (maxValue < bass)
                    {
                        maxValue = bass;
                        maxID    = i;
                    }
                }
                mSimilarity[(int)position[i]] = (float)bass * 100;
                MyLog.LogManager.Log("SimilarImage-Analyze-Method[" + (int)position[i] + "] Perfect: " + mSimilarity[(int)position[i]]);
            }


            MyLog.LogManager.Log("SimilarImage-Analyze-가장 유사한 그림의 유사도: " + maxValue);
            Dispatcher.Invoke(new Action(delegate()
            {
                BitmapImage tmpImage = new BitmapImage();
                tmpImage.BeginInit();
                tmpImage.CacheOption = BitmapCacheOption.OnLoad;
                mResultIndex         = (int)position[maxID];
                tmpImage.UriSource   = new Uri(mSimilarImage[mResultIndex].URL);
                tmpImage.EndInit();
                similar_result_image.Source = tmpImage;
                similar_analyze.Content     = FindResource(Constants.STRING_BUTTON_COMPLETE);
                similar_analyze.IsEnabled   = false;

                similar_btn_target_histogram.IsEnabled = true;
                similar_btn_result_histogram.IsEnabled = true;

                StringBuilder str = new StringBuilder();
                for (int i = 0; i < length; i++)
                {
                    str.Clear();
                    str.Append((string)FindResource(Constants.STRING_SIMILAR_LABEL));
                    str.Append(string.Format(" {0:0.####}", mSimilarity[(int)position[i]]));
                    str.Append("%");
                    mSimilarLabel[(int)position[i]].Content = str.ToString();
                }
            }));
        }