C# OpenCV 图形图像 图像处理28 特征匹配
using OpenCvSharp;
using OpenCvSharp.XFeatures2D;
using System;
using System.Collections.Generic;
namespace OpenCV {
class OpenCV {
static void Main(string[] args) {
Cv2.ImShow("OpenCV", MatchBySURF1());
Cv2.WaitKey();
}
/// <summary>
/// SURF 特征匹配
/// </summary>
/// <returns></returns>
private static Mat MatchBySURF1() {
Mat src2 = new(@"C:\Users\hyacinth\Desktop\1.jpg", ImreadModes.Color);
Mat src1 = new(@"C:\Users\hyacinth\Desktop\2.jpg", ImreadModes.Color);
var gray1 = new Mat();
var gray2 = new Mat();
Cv2.CvtColor(src1, gray1, ColorConversionCodes.BGR2GRAY);
Cv2.CvtColor(src2, gray2, ColorConversionCodes.BGR2GRAY);
var surf = SURF.Create(1000, 4, 2, true);
var descriptors1 = new Mat();
var descriptors2 = new Mat();
surf.DetectAndCompute(gray1, null, out KeyPoint[] keypoints1, descriptors1);
surf.DetectAndCompute(gray2, null, out KeyPoint[] keypoints2, descriptors2);
var matcher = new BFMatcher(NormTypes.L2, false);
DMatch[] matches = matcher.Match(descriptors1, descriptors2);
matches = FindGoodMatchs(descriptors1, matches);
Mat img = new();
Cv2.DrawMatches(gray1, keypoints1, gray2, keypoints2, matches, img, null, null, null, DrawMatchesFlags.NotDrawSinglePoints);
return img;
}
/// <summary>
/// FindGoodMatchs
/// </summary>
/// <param name="src"></param>
/// <param name="matches"></param>
/// <returns></returns>
private static DMatch[] FindGoodMatchs(Mat src, DMatch[] matches) {
double max = 0, min = 1000;
for (int i = 0; i < src.Rows; i++) {
double dist = matches[i].Distance;
if (dist > max) {
max = dist;
}
if (dist < min) {
min = dist;
}
}
var good = new List<DMatch>();
for (int i = 0; i < src.Rows; i++) {
double dist = matches[i].Distance;
if (dist < Math.Max(3 * min, 0.02)) {
good.Add(matches[i]);
}
}
return good.ToArray();
}
/// <summary>
/// SURF 特征匹配
/// </summary>
/// <returns></returns>
private static Mat MatchBySURF2() {
Mat src2 = new(@"C:\Users\hyacinth\Desktop\1.jpg", ImreadModes.Color);
Mat src1 = new(@"C:\Users\hyacinth\Desktop\2.jpg", ImreadModes.Color);
var gray1 = new Mat();
var gray2 = new Mat();
Cv2.CvtColor(src1, gray1, ColorConversionCodes.BGR2GRAY);
Cv2.CvtColor(src2, gray2, ColorConversionCodes.BGR2GRAY);
var surf = SURF.Create(1000, 4, 2, true);
var descriptors1 = new Mat();
var descriptors2 = new Mat();
surf.DetectAndCompute(gray1, null, out KeyPoint[] keypoints1, descriptors1);
surf.DetectAndCompute(gray2, null, out KeyPoint[] keypoints2, descriptors2);
var matcher = new FlannBasedMatcher();
DMatch[] matches = matcher.Match(descriptors1, descriptors2);
var img = new Mat();
Cv2.DrawMatches(gray1, keypoints1, gray2, keypoints2, matches, img, new Scalar(0, 255, 0), new Scalar(0, 0, 255), null, DrawMatchesFlags.NotDrawSinglePoints);
return img;
}
}
}