private void MatchBySurf(Mat src1, Mat src2) { var gray1 = new Mat(); var gray2 = new Mat(); Cv2.CvtColor(src1, gray1, ColorConversionCodes.BGR2GRAY); Cv2.CvtColor(src2, gray2, ColorConversionCodes.BGR2GRAY); var surf = SURF.Create(500, 4, 2, true); // Detect the keypoints and generate their descriptors using SURF KeyPoint[] keypoints1, keypoints2; var descriptors1 = new MatOfFloat(); var descriptors2 = new MatOfFloat(); surf.Compute(gray1, null, out keypoints1, descriptors1); surf.Compute(gray2, null, out keypoints2, descriptors2); // Match descriptor vectors var bfMatcher = new BFMatcher(NormTypes.L2, false); var flannMatcher = new FlannBasedMatcher(); DMatch[] bfMatches = bfMatcher.Match(descriptors1, descriptors2); DMatch[] flannMatches = flannMatcher.Match(descriptors1, descriptors2); // Draw matches var bfView = new Mat(); Cv2.DrawMatches(gray1, keypoints1, gray2, keypoints2, bfMatches, bfView); var flannView = new Mat(); Cv2.DrawMatches(gray1, keypoints1, gray2, keypoints2, flannMatches, flannView); using (new Window("SURF matching (by BFMather)", WindowMode.AutoSize, bfView)) using (new Window("SURF matching (by FlannBasedMatcher)", WindowMode.AutoSize, flannView)) { Cv2.WaitKey(); } }
private void FindMatchingFeatures_Click(object sender, EventArgs e) { var file1 = comboBox1.SelectedItem.ToString(); var file2 = comboBox2.SelectedItem.ToString(); using (var img1 = new Mat(file1, ImreadModes.GrayScale)) using (var img2 = new Mat(file2, ImreadModes.GrayScale)) using (var dst = new Mat()) { // find keypoints //var kp1 = FindFeatures(Constants.ImageControl1); //var kp2 = FindFeatures(Constants.ImageControl2); // find descriptors var descriptors1 = new Mat(); var descriptors2 = new Mat(); var kp1 = FindFeaturesDescriptors_ORB(file1, out descriptors1); var kp2 = FindFeaturesDescriptors_ORB(file2, out descriptors2); // find keypoint matches var bfMatcher = new BFMatcher(NormTypes.Hamming2, true); DMatch[] bfMatches = bfMatcher.Match(descriptors1, descriptors2); // draw things Cv2.DrawMatches(img1, kp1, img2, kp2, bfMatches, dst); using (new Window("ORB matching (by BFMatcher)", WindowMode.FreeRatio, dst)) { Cv2.WaitKey(); } } }