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

相关推荐
Yo_Becky15 分钟前
【PyTorch】PyTorch预训练模型缓存位置迁移,也可拓展应用于其他文件的迁移
人工智能·pytorch·经验分享·笔记·python·程序人生·其他
DeepSeek-大模型系统教程18 分钟前
深入金融与多模态场景实战:金融文档分块技术与案例汇总
人工智能·ai·语言模型·程序员·大模型·大模型学习·大模型教程
xinxiangwangzhi_23 分钟前
pytorch底层原理学习--PyTorch 架构梳理
人工智能·pytorch·架构
yzx99101327 分钟前
关于网络协议
网络·人工智能·python·网络协议
AiTEN_Robot28 分钟前
AGV 无人叉车关键技术问题解析:精准定位算法 / 安全避障逻辑 / 系统对接协议全方案
人工智能·机器人·自动化·制造
云天徽上30 分钟前
【PaddleOCR】OCR常见关键信息抽取数据集,包含FUNSD、XFUND、WildReceipt等整理,持续更新中......
人工智能·计算机视觉·信息可视化·paddlepaddle·paddleocr·文本识别
zskj_zhyl30 分钟前
智绅科技:以科技为翼,构建养老安全守护网
人工智能·科技·安全
刘海东刘海东31 分钟前
结构型智能科技的关键可行性——信息型智能向结构型智能的转换(提纲)
人工智能
Jay Kay1 小时前
TensorFlow源码深度阅读指南
人工智能·python·tensorflow
FF-Studio1 小时前
【硬核数学 · LLM篇】3.1 Transformer之心:自注意力机制的线性代数解构《从零构建机器学习、深度学习到LLM的数学认知》
人工智能·pytorch·深度学习·线性代数·机器学习·数学建模·transformer