C# OpenCV 图形图像 图像处理28 特征匹配

15 篇文章 0 订阅

C# OpenCV 图形图像 图像处理28 特征匹配

using OpenCvSharp;
using OpenCvSharp.XFeatures2D;
using System;
using System.Collections.Generic;

namespace OpenCV {
    class OpenCV {
        static void Main(string[] args) {
            Cv2.ImShow("OpenCV", MatchBySURF1());
            Cv2.WaitKey();
        }

        /// <summary>
        /// SURF 特征匹配
        /// </summary>
        /// <returns></returns>
        private static Mat MatchBySURF1() {
            Mat src2 = new(@"C:\Users\hyacinth\Desktop\1.jpg", ImreadModes.Color);
            Mat src1 = new(@"C:\Users\hyacinth\Desktop\2.jpg", ImreadModes.Color);

            var gray1 = new Mat();
            var gray2 = new Mat();

            Cv2.CvtColor(src1, gray1, ColorConversionCodes.BGR2GRAY);
            Cv2.CvtColor(src2, gray2, ColorConversionCodes.BGR2GRAY);

            var surf = SURF.Create(1000, 4, 2, true);

            var descriptors1 = new Mat();
            var descriptors2 = new Mat();
            surf.DetectAndCompute(gray1, null, out KeyPoint[] keypoints1, descriptors1);
            surf.DetectAndCompute(gray2, null, out KeyPoint[] keypoints2, descriptors2);

            var matcher = new BFMatcher(NormTypes.L2, false);
            DMatch[] matches = matcher.Match(descriptors1, descriptors2);

            matches = FindGoodMatchs(descriptors1, matches);

            Mat img = new();
            Cv2.DrawMatches(gray1, keypoints1, gray2, keypoints2, matches, img, null, null, null, DrawMatchesFlags.NotDrawSinglePoints);

            return img;
        }

        /// <summary>
        /// FindGoodMatchs
        /// </summary>
        /// <param name="src"></param>
        /// <param name="matches"></param>
        /// <returns></returns>
        private static DMatch[] FindGoodMatchs(Mat src, DMatch[] matches) {
            double max = 0, min = 1000;
            for (int i = 0; i < src.Rows; i++) {
                double dist = matches[i].Distance;
                if (dist > max) {
                    max = dist;
                }
                if (dist < min) {
                    min = dist;
                }
            }
            var good = new List<DMatch>();
            for (int i = 0; i < src.Rows; i++) {
                double dist = matches[i].Distance;
                if (dist < Math.Max(3 * min, 0.02)) {
                    good.Add(matches[i]);
                }
            }
            return good.ToArray();
        }

        /// <summary>
        /// SURF 特征匹配
        /// </summary>
        /// <returns></returns>
        private static Mat MatchBySURF2() {
            Mat src2 = new(@"C:\Users\hyacinth\Desktop\1.jpg", ImreadModes.Color);
            Mat src1 = new(@"C:\Users\hyacinth\Desktop\2.jpg", ImreadModes.Color);

            var gray1 = new Mat();
            var gray2 = new Mat();

            Cv2.CvtColor(src1, gray1, ColorConversionCodes.BGR2GRAY);
            Cv2.CvtColor(src2, gray2, ColorConversionCodes.BGR2GRAY);

            var surf = SURF.Create(1000, 4, 2, true);

            var descriptors1 = new Mat();
            var descriptors2 = new Mat();
            surf.DetectAndCompute(gray1, null, out KeyPoint[] keypoints1, descriptors1);
            surf.DetectAndCompute(gray2, null, out KeyPoint[] keypoints2, descriptors2);

            var matcher = new FlannBasedMatcher();
            DMatch[] matches = matcher.Match(descriptors1, descriptors2);

            var img = new Mat();
            Cv2.DrawMatches(gray1, keypoints1, gray2, keypoints2, matches, img, new Scalar(0, 255, 0), new Scalar(0, 0, 255), null, DrawMatchesFlags.NotDrawSinglePoints);

            return img;
        }

    }
}

在这里插入图片描述
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值