RootSIFT的目标定位,opencvsharp。

首先截取匹配模板,然后使用rootsift特征匹配,最后定位目标。

对于微弱变化,还是能够识别定位的,对于传统算法来说已经不错了。

目标定位效果:

使用的模板图片。

cs 复制代码
using OpenCvSharp;
using OpenCvSharp.Features2D;

using Point = OpenCvSharp.Point;


namespace WinFormsApp8
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        // 转换为RootSIFT描述子
        static void ConvertToRootSIFT(Mat descriptors)
        {
            // L1归一化
            for (int i = 0; i < descriptors.Rows; i++)
            {
                var row = descriptors.Row(i);
                double sum = Cv2.Norm(row, NormTypes.L1);
                row /= sum;
            }
            // 平方根处理
            Cv2.Sqrt(descriptors, descriptors);

        }

        // 特征匹配
        static List<DMatch> MatchFeatures(Mat queryDescriptors, Mat sceneDescriptors)
        {
            var matcher = new BFMatcher(NormTypes.L2);
            var matches = matcher.KnnMatch(queryDescriptors, sceneDescriptors, 2);

            // 应用比率测试
            var goodMatches = new List<DMatch>();
            foreach (var match in matches)
            {
                if (match[0].Distance < 0.75 * match[1].Distance)
                {
                    goodMatches.Add(match[0]);
                }
            }

            return goodMatches;
        }

        // 绘制结果
        static void DrawResult(Mat image, RotatedRect rect)
        {
            // 绘制旋转矩形
            Point2f[] vertices = rect.Points();
            for (int i = 0; i < 4; i++)
            {
                Cv2.Line(image, (Point)vertices[i], (Point)vertices[(i + 1) % 4],
                        new Scalar(0, 255, 0), 3);
            }

            // 绘制矩形中心
            Cv2.Circle(image, (Point)rect.Center, 5, new Scalar(0, 0, 255), -1);
        }
        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                Mat queryImage = Cv2.ImRead("2.bmp", ImreadModes.Color);
                using var queryGray = new Mat();
                Cv2.CvtColor(queryImage, queryGray, ColorConversionCodes.BGR2GRAY);
              
                using var sceneImage = new Mat(Environment.CurrentDirectory + "\\s.bmp", ImreadModes.Color);

                if (queryImage.Empty() || sceneImage.Empty())
                {
                    Console.WriteLine("无法加载图像!");
                    return;
                }
                // 转换为灰度图
                using var sceneGray = new Mat();

                Cv2.CvtColor(sceneImage, sceneGray, ColorConversionCodes.BGR2GRAY);

                // 初始化SIFT检测器
                var sift = SIFT.Create();

                // 检测关键点和计算描述子
                KeyPoint[] queryKeypoints, sceneKeypoints;
                Mat queryDescriptors = new Mat(), sceneDescriptors = new Mat();
                sift.DetectAndCompute(queryGray, null, out queryKeypoints, queryDescriptors);
                sift.DetectAndCompute(sceneGray, null, out sceneKeypoints, sceneDescriptors);

                // 转换为RootSIFT描述子
                ConvertToRootSIFT(queryDescriptors);
                ConvertToRootSIFT(sceneDescriptors);

                // 特征匹配
                var matches = MatchFeatures(queryDescriptors, sceneDescriptors);

                // 获取匹配点对
                var queryPoints = matches.Select(m => queryKeypoints[m.QueryIdx].Pt).ToArray();
                var scenePoints = matches.Select(m => sceneKeypoints[m.TrainIdx].Pt).ToArray();

                if (queryPoints.Length >= 8 && scenePoints.Length >= 8)//这里数字可以改
                {
                    // 计算单应性矩阵
                    var homography = Cv2.FindHomography(InputArray.Create(queryPoints),
                                           InputArray.Create(scenePoints),
                                           HomographyMethods.Ransac, 5.0);

                    // 获取查询图像的四个角点
                    var queryCorners = new Point2f[]
                    {
                      new Point2f(0, 0),
                      new Point2f(queryImage.Cols, 0),
                      new Point2f(queryImage.Cols, queryImage.Rows),
                      new Point2f(0, queryImage.Rows)
                    };

                    // 变换到场景图像中
                    var sceneCorners = Cv2.PerspectiveTransform(queryCorners, homography);

                    // 计算最小外接矩形
                    var minRect = Cv2.MinAreaRect(sceneCorners);

                    // 绘制结果
                    DrawResult(sceneImage, minRect);
                    // 显示结果
                    // 转换为轴对齐矩形
                   // Rect boundingRect = Cv2.BoundingRect(minRect.Points().Select(p => new Point((int)p.X, (int)p.Y)).ToArray());
                    Cv2.ImShow("pic", sceneImage);
                    Cv2.WaitKey(0);
                }
                else
                {
                    MessageBox.Show("没有足够的匹配点来计算变换矩阵");
                }

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
       
    }
}

【免费】RootSIFT的目标定位,opencvsharp资源-CSDN文库https://download.csdn.net/download/vokxchh/90968508

相关推荐
2401_8318960321 分钟前
机器学习(13):逻辑回归
人工智能·机器学习·逻辑回归
山烛1 小时前
决策树学习全解析:从理论到实战
人工智能·python·学习·算法·决策树·机器学习
马拉AI1 小时前
ICCV 2025|可灵团队新作 ReCamMaster:从单视频到多视角生成,多角度看好莱坞大片
计算机视觉·音视频
YuhsiHu2 小时前
【论文简读】LongSplat
人工智能·深度学习·计算机视觉·3d
2zcode2 小时前
基于Matlab图像处理的液晶显示器表面缺陷检测与分类研究
人工智能·计算机视觉
白杨SEO营销2 小时前
白杨SEO:百度搜索开放平台发布AI计划是什么?MCP网站红利来了?顺带说说其它
人工智能·百度
有Li2 小时前
探索医学领域多模态人工智能的发展图景:技术挑战与临床应用的范围综述|文献速递-医学影像算法文献分享
论文阅读·人工智能·医学生
陈大鱼头3 小时前
PromptPilot — AI 自动化任务的下一个环节
人工智能
若天明3 小时前
深度学习-卷积神经网络CNN-卷积层
人工智能·深度学习·cnn