用 OpenCVSharp 4.5 跑一遍 OpenCV 官方教程
原 OpenCV 官方教程链接:OpenCV: Feature Description
核心要点:
- 使用 DescriptorExtractor 接口方法找到关键点的特征向量
- 使用 xfeatures2d::SURF::compute to 进行计算
- 使用 DescriptorMatcher 来匹配特征向量
- 使用 drawMatches 画出匹配点
using System;
using OpenCvSharp;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OpenCvSharp.XFeatures2D;
namespace ConsoleApp1
{
class tutorial48:ITutorial
{
public void Run()
{
string input1 = @"I:\csharp\images\baboon.jpg";
string input2 = @"I:\csharp\images\baboon_rotate.jpg";
Mat img1 = Cv2.ImRead(input1, ImreadModes.Color);
Mat img2 = Cv2.ImRead(input2, ImreadModes.Color);
if (img1.Empty() || img2.Empty())
{
Console.WriteLine("无法打开图像文件");
return;
}
//第一步:用 SURF Detector 检测关键点,然后计算特征描述向量
int minHessian = 400;
SURF detector = SURF.Create(minHessian);
KeyPoint[] keypoints1, keypoints2;
Mat descriptor1 = new Mat(), descriptor2 = new Mat();
detector.DetectAndCompute(img1, null, out keypoints1, descriptor1);
detector.DetectAndCompute(img2, null, out keypoints2, descriptor2);
//第二步:用暴力法匹配特征描述向量
DescriptorMatcher matcher = DescriptorMatcher.Create("BruteForce");
DMatch[] matches = matcher.Match(descriptor1, descriptor2);
//第三步:画出匹配线
Mat image_matches = new Mat();
Cv2.DrawMatches(img1, keypoints1, img2, keypoints2, matches, image_matches);
Cv2.ImShow("Matches", image_matches);
Cv2.WaitKey();
}
}
}