当前位置: 首页 > java >正文

RootSIFT的目标定位,opencvsharp。

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

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

目标定位效果:

 使用的模板图片。

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

http://www.xdnf.cn/news/12812.html

相关文章:

  • DOM(文档对象模型)深度解析
  • 开源项目实战学习之YOLO11:12.6 ultralytics-models-tiny_encoder.py
  • 【深度学习-Day 25】告别过拟合:深入解析 L1 与 L2 正则化(权重衰减)的原理与实战
  • 标准代码项目开发流程学习指南
  • CMS内容管理系统的设计与实现:架构设计
  • 红黑树完全指南:为何工程都用它?原理、实现、场景、误区全解析
  • 数学:”度量空间”了解一下?
  • JESD204B IP核接口实例,ADI的ADRV9009板卡,ZYNQ7045驱动实现2发2收。
  • LLMs 系列科普文(14)
  • 关于IE浏览器被绑定安装,还卸载不掉
  • 72常用控件_QGridLayout的使用
  • 热成像实例分割电力设备数据集(3类,838张)
  • Vscode下Go语言环境配置
  • 矢状位片不可用怎么办?前后位测量方法评估骨盆倾斜角!
  • 智能职业发展系统:AI驱动的职业规划平台技术解析
  • LLMs 系列科普文(2)
  • python:Tkinter 开发邮件客户端,能编写邮件,发送邮件带附件
  • F(x, y, z) = 0 隐函数微分 确定自变量
  • 【资源分享】手机玩转经典游戏!小鸡模拟器1.9.0:PSP/NDS/GBA完美运行!
  • SSE (Server-Sent Events) 技术简介
  • Java八股文——并发编程「并发安全篇」
  • C-Equilateral Triangle
  • Windows安装Miniconda
  • 鸿蒙学习笔记01
  • 手写 vue 源码 === runtime-core 实现
  • RISC-V 开发板 + Ubuntu 23.04 部署 open_vins 过程
  • Kaggle注册不成功,添加插件header Editor
  • FreeRTOS同步和互斥
  • CppCon 2015 学习:Large Scale C++ With Modules
  • Codeforces Educational 179(ABCDE)