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日

相关文章

  • asp.net子窗体与父窗体交互实战分享

    ASP.NET 子窗体与父窗体交互实战分享 本文主要介绍ASP.NET中子窗体与父窗体交互的实现方法。涉及到了IFrame嵌套、控件之间的通信等具体技术细节。 IFrame父子窗体嵌套实现方式 父子窗体嵌套方式主要有两种,一种是利用IFrame实现,另一种则是采用模态窗口的方式。这里介绍第一种方式。 在ASP.NET中,可以在主页面中嵌入一个IFrame页面…

    C# 2023年6月3日
    00
  • C# Linq的Contains()方法 – 确定序列是否包含指定的元素

    当我们在处理集合数据时,可能经常用到判断某个元素是否在集合中的需求。这时,Linq中的Contains()方法就可以派上用场了。在本次攻略中,我们将详细讲解C# Linq的Contains()方法。 一、Contains()方法是什么 Contains()方法是Linq中用于判断某个元素是否在集合中的方法。其返回值为bool类型,true表示元素在集合中,f…

    C# 2023年4月19日
    00
  • IIS下调用证书出现异常的解决方法 (C#)

    针对“IIS下调用证书出现异常的解决方法(C#)”这个问题,我来给出一份完整的攻略,步骤如下: 步骤一:检查证书是否安装正确 在IIS服务器上,需要将证书正确地安装并且匹配相应的网站。所以,第一步是确保证书在服务器上正确地安装了,以及是否与网站匹配。如果证书未正确安装或匹配,将会出现调用证书异常的问题。你可以通过以下步骤来检查证书是否安装正确: 打开IIS …

    C# 2023年5月15日
    00
  • C#调用Matlab生成的dll方法的详细说明

    下面我会详细讲解C#调用Matlab生成的dll方法的完整攻略。步骤如下: 步骤一:生成Matlab的DLL文件 在Matlab中打开需要生成DLL的.m文件,在命令行中输入命令:mbuild -setup。根据提示选择安装需要的编译器,完成后在命令行中输入命令:mbuild <filename>.m,生成对应的DLL文件。 步骤二:在C#项目中…

    C# 2023年6月7日
    00
  • C#中实现线程同步lock关键字的用法详解

    下面是“C#中实现线程同步lock关键字的用法详解”的完整攻略。 1. 什么是线程同步 线程同步是指不同线程之间按照一定的顺序执行,避免线程之间的竞争和混乱。在多线程编程中,线程同步非常重要。C# 中的 lock 关键字可以用来实现线程同步。 2. lock关键字的语法 lock 关键字用于保护一个代码快,以确保只有一个线程可以访问它。lock 关键字必须使…

    C# 2023年6月7日
    00
  • Python集成C#实现界面操作下载文件功能的全过程

    下面我将详细讲解如何使用Python集成C#程序实现界面操作下载文件的全过程。 准备工作 在开始之前我们需要做一些准备工作: 安装 Python 和 .NET Framework (C#程序需要运行在.NET环境下) 安装 Python 通过.NET控制C#程序的模块 pythonnet 编写C#程序,实现下载文件的功能 编写 Python 程序界面,通过调…

    C# 2023年5月15日
    00
  • .NET一行代码实现GC调优,让程序不再占用内存

    以下是关于“.NET一行代码实现GC调优,让程序不再占用内存”的完整攻略: 1. 什么是GC? GC(Garbage Collection)是一种动态内存管理机制,它负责在程序运行时自动回收不再使用的内存。在.NET中,GC由CLR(Common Language Runtime)提供的。 2. GC调优 GC调优是一种优化内存使用的过程,它旨在减少内存使用…

    C# 2023年5月12日
    00
  • C# File.Create(string path):创建指定文件,并返回FileStream对象

    C#的File.Create(string path)方法详解 作用 C#的File类提供了许多用于文件操作的方法和属性。其中,File.Create(string path)方法用于创建文件,其具体作用如下: 如果指定的文件不存在,则创建一个新文件 如果指定的文件存在,则覆盖该文件并截断其长度为 0 语法 public static FileStream …

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