C#中OpenCvSharp 通过特征点匹配图片的方法

C#中OpenCvSharp 通过特征点匹配图片的方法是一种流行的计算机视觉技术,可以用于图像识别和图像匹配。下面是详细的攻略步骤:

1. 安装OpenCvSharp

首先需要在C#项目中安装OpenCvSharp库,可以使用nuget包管理器进行安装,或下载并手动添加OpenCvSharp.dll和OpenCvSharpExtern.dll的引用。

2. 加载图片

使用Cv2.ImRead加载需要匹配的两张图片,并转化为灰度图像。

Mat img1 = Cv2.ImRead("img1.jpg", ImreadModes.GrayScale);
Mat img2 = Cv2.ImRead("img2.jpg", ImreadModes.GrayScale);

3. 计算特征点

通过SURF算法计算图片中的特征点,并画出特征点位置。

SURF surf = SURF.Create(500, 4, 2, false, false);
KeyPoint[] kp1, kp2;
Mat des1 = new Mat(), des2 = new Mat();
surf.DetectAndCompute(img1, null, out kp1, des1);
surf.DetectAndCompute(img2, null, out kp2, des2);
Mat imgKp1 = new Mat(), imgKp2 = new Mat();
Cv2.DrawKeypoints(img1, kp1, imgKp1);
Cv2.DrawKeypoints(img2, kp2, imgKp2);

4. 特征点匹配

使用BruteForceMatcher进行特征点匹配

var matcher = new BFMatcher(NormTypes.L2, false);
DMatch[] rawMatches = matcher.Match(des1, des2);

5. 进行筛选

为了提高匹配精度,需要对匹配结果进行筛选。可以使用Ratio Test算法或其他方法进行筛选,在这里我们使用Ratio Test算法。

List<DMatch> goodMatches = new List<DMatch>();
double threshold = 0.7;
for (int i = 0; i < rawMatches.Length; i++)
{
    if (rawMatches[i].Distance < threshold * rawMatches[i+1].Distance)
    {
        goodMatches.Add(rawMatches[i]);
    }
}

6. 显示匹配结果

将匹配结果绘制在一张图像上,可以使用Cv2.DrawMatches函数。

Mat imgMatches = new Mat();
Cv2.DrawMatches(img1, kp1, img2, kp2, goodMatches, imgMatches);

至此一个简单的特征点匹配的代码实现就完成了。下面是一个完整的示例代码:

using OpenCvSharp;
using System.Collections.Generic;

//加载图片
Mat img1 = Cv2.ImRead("img1.jpg", ImreadModes.GrayScale);
Mat img2 = Cv2.ImRead("img2.jpg", ImreadModes.GrayScale);

//计算特征点
SURF surf = SURF.Create(500, 4, 2, false, false);
KeyPoint[] kp1, kp2;
Mat des1 = new Mat(), des2 = new Mat();
surf.DetectAndCompute(img1, null, out kp1, des1);
surf.DetectAndCompute(img2, null, out kp2, des2);
Mat imgKp1 = new Mat(), imgKp2 = new Mat();
Cv2.DrawKeypoints(img1, kp1, imgKp1);
Cv2.DrawKeypoints(img2, kp2, imgKp2);

//特征点匹配
var matcher = new BFMatcher(NormTypes.L2, false);
DMatch[] rawMatches = matcher.Match(des1, des2);

//筛选
List<DMatch> goodMatches = new List<DMatch>();
double threshold = 0.7;
for (int i = 0; i < rawMatches.Length; i++)
{
    if (rawMatches[i].Distance < threshold * rawMatches[i + 1].Distance)
    {
        goodMatches.Add(rawMatches[i]);
    }
}

//显示匹配结果
Mat imgMatches = new Mat();
Cv2.DrawMatches(img1, kp1, img2, kp2, goodMatches, imgMatches);

下面是另一个示例,用SURF算法识别物体,实现简单的物体检测:

using OpenCvSharp;

//加载模板和待检测图片
Mat tmpl = Cv2.ImRead("template.jpg", ImreadModes.GrayScale);
Mat img = Cv2.ImRead("image.jpg", ImreadModes.GrayScale);

//计算特征点和描述子
SURF detector = SURF.Create(1000, 4, 2, false, false);
KeyPoint[] tmplKpts, imgKpts;
Mat tmplDesc, imgDesc;
detector.DetectAndCompute(tmpl, null, out tmplKpts, tmplDesc);
detector.DetectAndCompute(img, null, out imgKpts, imgDesc);

//特征点匹配
var matcher = new BFMatcher(NormTypes.L2, false);
DMatch[] rawMatches = matcher.Match(tmplDesc, imgDesc);

//筛选匹配点
List<KeyPoint> matchedKeypoints1 = new List<KeyPoint>();
List<KeyPoint> matchedKeypoints2 = new List<KeyPoint>();
double minDistance = 150;
for (int i = 0; i < rawMatches.Length; i++)
{
    DMatch rawMatch = rawMatches[i];
    if (rawMatch.Distance <= minDistance)
    {
        matchedKeypoints1.Add(tmplKpts[rawMatch.QueryIdx]);
        matchedKeypoints2.Add(imgKpts[rawMatch.TrainIdx]);
    }
}

//绘制匹配的点
Mat imgMatches = new Mat();
Cv2.DrawMatches(tmpl, tmplKpts, img, imgKpts, rawMatches, imgMatches);

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#中OpenCvSharp 通过特征点匹配图片的方法 - Python技术站

(0)
上一篇 2023年6月7日
下一篇 2023年6月7日

相关文章

  • c# base64转字符串实例

    当我们需要在c#中传递二进制数据时,往往需要将其转换为字符串格式,而常用的方法之一就是使用Base64进行编码。下面是将Base64字符串转换为普通字符串的步骤和示例。 1. C# Base64编码 C#中的Base64编码是通过System.Convert类实现的。该类中含有以下方法可供使用: //将字节数组转换为Base64字符串 string Conv…

    C# 2023年6月1日
    00
  • Asp.net Mvc 身份验证、异常处理、权限验证(拦截器)实现代码

    Asp.net MVC 是一种基于 Model-View-Controller (MVC) 的 Web 应用程序框架。在开发 Asp.net MVC 应用程序时,实现身份验证、异常处理以及权限验证是非常必要的功能。下面,我们将分别介绍这三种功能的实现方法。 Asp.net MVC 身份验证实现 在 Asp.net MVC 中,实现身份验证有多种方法,包括 F…

    C# 2023年5月31日
    00
  • c# 实现发送邮件到指定邮箱

    C#实现发送邮件到指定邮箱的攻略可以分为以下几个步骤: 导入命名空间 在C#中,我们需要使用System.Net.Mail这个命名空间来实现邮件发送功能,因此需要在开头添加该命名空间的引用。 using System.Net.Mail; 配置SMTP服务器信息 在使用C#发送邮件前,我们需要先配置SMTP服务器的相关信息,包括SMTP服务器地址、端口号、用户…

    C# 2023年6月1日
    00
  • C#中实现PriorityQueue优先级队列的代码

    实现PriorityQueue(优先级队列)在C#中是很常见的需求,下面我将为大家介绍如何使用C#编写PriorityQueue。 什么是PriorityQueue? PriorityQueue,即优先队列,是一种按照元素优先级进行排序的队列,具有以下特点: 在队列中插入元素时,会按照一定的优先级排序; 在队列中弹出元素时,会弹出队列中优先级最高的元素; 可…

    C# 2023年6月7日
    00
  • C#动态加载组件后如何在开发环境中调试详解

    要在开发环境中调试C#动态加载组件,可以按照以下步骤进行: 第一步:将组件代码添加到解决方案中 首先,需要将组件代码添加到解决方案中,这样才可以在开发环境中进行调试。具体步骤如下: 在Visual Studio中打开主项目的解决方案,右键点击解决方案文件夹,选择“添加”>“现有项目”将组件代码项目添加到解决方案中; 如果组件代码使用了外部依赖项,需要将…

    C# 2023年6月6日
    00
  • C#实现图形位置组合转换的方法

    C#实现图形位置组合转换的方法 在C#中,通过使用矩阵转换可以实现图形位置组合的转换。该方法包含两个部分:矩阵的生成和矩阵的应用。 矩阵的生成 通过创建Matrix类实例来生成矩阵,可以调用它的一些方法来定义矩阵,如平移、旋转和缩放等。以下是几个常用的矩阵生成方法: 平移矩阵 平移矩阵可以将图形向上或向下、向左或向右移动。可以使用Matrix类的Transl…

    C# 2023年6月8日
    00
  • C# 输出字符串到文本文件中的实现代码

    下面是在 C# 中输出字符串到文本文件中的实现代码攻略: 1. 创建文件并写入字符串 代码实现 using System.IO; // 定义字符串变量 string str = "hello world!"; // 创建一个文件流 FileStream fs = new FileStream("output.txt",…

    C# 2023年5月31日
    00
  • ASP.NET中的无刷新验证码的开发(完整代码)

    下面我将详细讲解ASP.NET中的无刷新验证码的开发,包括完整代码和示例说明。 环境准备 在开始开发之前,需要准备好以下环境:- Visual Studio 2019- .NET Framework 4.6.1或以上版本- jQuery库 实现流程 本篇攻略中的无刷新验证码,是通过使用jQuery和ASP.NET的Web服务技术实现的。具体的实现流程如下: …

    C# 2023年5月31日
    00
合作推广
合作推广
分享本页
返回顶部