using OpenCVForUnity.CoreModule; using OpenCVForUnity.Features2dModule; using OpenCVForUnity.UtilsModule; using System; using System.Collections.Generic; using System.Runtime.InteropServices; namespace OpenCVForUnity.Xfeatures2dModule { // C++: class Xfeatures2d public class Xfeatures2d { // // C++: void cv::xfeatures2d::matchGMS(Size size1, Size size2, vector_KeyPoint keypoints1, vector_KeyPoint keypoints2, vector_DMatch matches1to2, vector_DMatch& matchesGMS, bool withRotation = false, bool withScale = false, double thresholdFactor = 6.0) // /** * GMS (Grid-based Motion Statistics) feature matching strategy described in CITE: Bian2017gms . * param size1 Input size of image1. * param size2 Input size of image2. * param keypoints1 Input keypoints of image1. * param keypoints2 Input keypoints of image2. * param matches1to2 Input 1-nearest neighbor matches. * param matchesGMS Matches returned by the GMS matching strategy. * param withRotation Take rotation transformation into account. * param withScale Take scale transformation into account. * param thresholdFactor The higher, the less matches. * Note: * Since GMS works well when the number of features is large, we recommend to use the ORB feature and set FastThreshold to 0 to get as many as possible features quickly. * If matching results are not satisfying, please add more features. (We use 10000 for images with 640 X 480). * If your images have big rotation and scale changes, please set withRotation or withScale to true. */ public static void matchGMS(Size size1, Size size2, MatOfKeyPoint keypoints1, MatOfKeyPoint keypoints2, MatOfDMatch matches1to2, MatOfDMatch matchesGMS, bool withRotation, bool withScale, double thresholdFactor) { if (keypoints1 != null) keypoints1.ThrowIfDisposed(); if (keypoints2 != null) keypoints2.ThrowIfDisposed(); if (matches1to2 != null) matches1to2.ThrowIfDisposed(); if (matchesGMS != null) matchesGMS.ThrowIfDisposed(); Mat keypoints1_mat = keypoints1; Mat keypoints2_mat = keypoints2; Mat matches1to2_mat = matches1to2; Mat matchesGMS_mat = matchesGMS; xfeatures2d_Xfeatures2d_matchGMS_10(size1.width, size1.height, size2.width, size2.height, keypoints1_mat.nativeObj, keypoints2_mat.nativeObj, matches1to2_mat.nativeObj, matchesGMS_mat.nativeObj, withRotation, withScale, thresholdFactor); } /** * GMS (Grid-based Motion Statistics) feature matching strategy described in CITE: Bian2017gms . * param size1 Input size of image1. * param size2 Input size of image2. * param keypoints1 Input keypoints of image1. * param keypoints2 Input keypoints of image2. * param matches1to2 Input 1-nearest neighbor matches. * param matchesGMS Matches returned by the GMS matching strategy. * param withRotation Take rotation transformation into account. * param withScale Take scale transformation into account. * Note: * Since GMS works well when the number of features is large, we recommend to use the ORB feature and set FastThreshold to 0 to get as many as possible features quickly. * If matching results are not satisfying, please add more features. (We use 10000 for images with 640 X 480). * If your images have big rotation and scale changes, please set withRotation or withScale to true. */ public static void matchGMS(Size size1, Size size2, MatOfKeyPoint keypoints1, MatOfKeyPoint keypoints2, MatOfDMatch matches1to2, MatOfDMatch matchesGMS, bool withRotation, bool withScale) { if (keypoints1 != null) keypoints1.ThrowIfDisposed(); if (keypoints2 != null) keypoints2.ThrowIfDisposed(); if (matches1to2 != null) matches1to2.ThrowIfDisposed(); if (matchesGMS != null) matchesGMS.ThrowIfDisposed(); Mat keypoints1_mat = keypoints1; Mat keypoints2_mat = keypoints2; Mat matches1to2_mat = matches1to2; Mat matchesGMS_mat = matchesGMS; xfeatures2d_Xfeatures2d_matchGMS_11(size1.width, size1.height, size2.width, size2.height, keypoints1_mat.nativeObj, keypoints2_mat.nativeObj, matches1to2_mat.nativeObj, matchesGMS_mat.nativeObj, withRotation, withScale); } /** * GMS (Grid-based Motion Statistics) feature matching strategy described in CITE: Bian2017gms . * param size1 Input size of image1. * param size2 Input size of image2. * param keypoints1 Input keypoints of image1. * param keypoints2 Input keypoints of image2. * param matches1to2 Input 1-nearest neighbor matches. * param matchesGMS Matches returned by the GMS matching strategy. * param withRotation Take rotation transformation into account. * Note: * Since GMS works well when the number of features is large, we recommend to use the ORB feature and set FastThreshold to 0 to get as many as possible features quickly. * If matching results are not satisfying, please add more features. (We use 10000 for images with 640 X 480). * If your images have big rotation and scale changes, please set withRotation or withScale to true. */ public static void matchGMS(Size size1, Size size2, MatOfKeyPoint keypoints1, MatOfKeyPoint keypoints2, MatOfDMatch matches1to2, MatOfDMatch matchesGMS, bool withRotation) { if (keypoints1 != null) keypoints1.ThrowIfDisposed(); if (keypoints2 != null) keypoints2.ThrowIfDisposed(); if (matches1to2 != null) matches1to2.ThrowIfDisposed(); if (matchesGMS != null) matchesGMS.ThrowIfDisposed(); Mat keypoints1_mat = keypoints1; Mat keypoints2_mat = keypoints2; Mat matches1to2_mat = matches1to2; Mat matchesGMS_mat = matchesGMS; xfeatures2d_Xfeatures2d_matchGMS_12(size1.width, size1.height, size2.width, size2.height, keypoints1_mat.nativeObj, keypoints2_mat.nativeObj, matches1to2_mat.nativeObj, matchesGMS_mat.nativeObj, withRotation); } /** * GMS (Grid-based Motion Statistics) feature matching strategy described in CITE: Bian2017gms . * param size1 Input size of image1. * param size2 Input size of image2. * param keypoints1 Input keypoints of image1. * param keypoints2 Input keypoints of image2. * param matches1to2 Input 1-nearest neighbor matches. * param matchesGMS Matches returned by the GMS matching strategy. * Note: * Since GMS works well when the number of features is large, we recommend to use the ORB feature and set FastThreshold to 0 to get as many as possible features quickly. * If matching results are not satisfying, please add more features. (We use 10000 for images with 640 X 480). * If your images have big rotation and scale changes, please set withRotation or withScale to true. */ public static void matchGMS(Size size1, Size size2, MatOfKeyPoint keypoints1, MatOfKeyPoint keypoints2, MatOfDMatch matches1to2, MatOfDMatch matchesGMS) { if (keypoints1 != null) keypoints1.ThrowIfDisposed(); if (keypoints2 != null) keypoints2.ThrowIfDisposed(); if (matches1to2 != null) matches1to2.ThrowIfDisposed(); if (matchesGMS != null) matchesGMS.ThrowIfDisposed(); Mat keypoints1_mat = keypoints1; Mat keypoints2_mat = keypoints2; Mat matches1to2_mat = matches1to2; Mat matchesGMS_mat = matchesGMS; xfeatures2d_Xfeatures2d_matchGMS_13(size1.width, size1.height, size2.width, size2.height, keypoints1_mat.nativeObj, keypoints2_mat.nativeObj, matches1to2_mat.nativeObj, matchesGMS_mat.nativeObj); } // // C++: void cv::xfeatures2d::matchLOGOS(vector_KeyPoint keypoints1, vector_KeyPoint keypoints2, vector_int nn1, vector_int nn2, vector_DMatch matches1to2) // /** * LOGOS (Local geometric support for high-outlier spatial verification) feature matching strategy described in CITE: Lowry2018LOGOSLG . * param keypoints1 Input keypoints of image1. * param keypoints2 Input keypoints of image2. * param nn1 Index to the closest BoW centroid for each descriptors of image1. * param nn2 Index to the closest BoW centroid for each descriptors of image2. * param matches1to2 Matches returned by the LOGOS matching strategy. * Note: * This matching strategy is suitable for features matching against large scale database. * First step consists in constructing the bag-of-words (BoW) from a representative image database. * Image descriptors are then represented by their closest codevector (nearest BoW centroid). */ public static void matchLOGOS(MatOfKeyPoint keypoints1, MatOfKeyPoint keypoints2, MatOfInt nn1, MatOfInt nn2, MatOfDMatch matches1to2) { if (keypoints1 != null) keypoints1.ThrowIfDisposed(); if (keypoints2 != null) keypoints2.ThrowIfDisposed(); if (nn1 != null) nn1.ThrowIfDisposed(); if (nn2 != null) nn2.ThrowIfDisposed(); if (matches1to2 != null) matches1to2.ThrowIfDisposed(); Mat keypoints1_mat = keypoints1; Mat keypoints2_mat = keypoints2; Mat nn1_mat = nn1; Mat nn2_mat = nn2; Mat matches1to2_mat = matches1to2; xfeatures2d_Xfeatures2d_matchLOGOS_10(keypoints1_mat.nativeObj, keypoints2_mat.nativeObj, nn1_mat.nativeObj, nn2_mat.nativeObj, matches1to2_mat.nativeObj); } #if (UNITY_IOS || UNITY_WEBGL) && !UNITY_EDITOR const string LIBNAME = "__Internal"; #else const string LIBNAME = "opencvforunity"; #endif // C++: void cv::xfeatures2d::matchGMS(Size size1, Size size2, vector_KeyPoint keypoints1, vector_KeyPoint keypoints2, vector_DMatch matches1to2, vector_DMatch& matchesGMS, bool withRotation = false, bool withScale = false, double thresholdFactor = 6.0) [DllImport(LIBNAME)] private static extern void xfeatures2d_Xfeatures2d_matchGMS_10(double size1_width, double size1_height, double size2_width, double size2_height, IntPtr keypoints1_mat_nativeObj, IntPtr keypoints2_mat_nativeObj, IntPtr matches1to2_mat_nativeObj, IntPtr matchesGMS_mat_nativeObj, [MarshalAs(UnmanagedType.U1)] bool withRotation, [MarshalAs(UnmanagedType.U1)] bool withScale, double thresholdFactor); [DllImport(LIBNAME)] private static extern void xfeatures2d_Xfeatures2d_matchGMS_11(double size1_width, double size1_height, double size2_width, double size2_height, IntPtr keypoints1_mat_nativeObj, IntPtr keypoints2_mat_nativeObj, IntPtr matches1to2_mat_nativeObj, IntPtr matchesGMS_mat_nativeObj, [MarshalAs(UnmanagedType.U1)] bool withRotation, [MarshalAs(UnmanagedType.U1)] bool withScale); [DllImport(LIBNAME)] private static extern void xfeatures2d_Xfeatures2d_matchGMS_12(double size1_width, double size1_height, double size2_width, double size2_height, IntPtr keypoints1_mat_nativeObj, IntPtr keypoints2_mat_nativeObj, IntPtr matches1to2_mat_nativeObj, IntPtr matchesGMS_mat_nativeObj, [MarshalAs(UnmanagedType.U1)] bool withRotation); [DllImport(LIBNAME)] private static extern void xfeatures2d_Xfeatures2d_matchGMS_13(double size1_width, double size1_height, double size2_width, double size2_height, IntPtr keypoints1_mat_nativeObj, IntPtr keypoints2_mat_nativeObj, IntPtr matches1to2_mat_nativeObj, IntPtr matchesGMS_mat_nativeObj); // C++: void cv::xfeatures2d::matchLOGOS(vector_KeyPoint keypoints1, vector_KeyPoint keypoints2, vector_int nn1, vector_int nn2, vector_DMatch matches1to2) [DllImport(LIBNAME)] private static extern void xfeatures2d_Xfeatures2d_matchLOGOS_10(IntPtr keypoints1_mat_nativeObj, IntPtr keypoints2_mat_nativeObj, IntPtr nn1_mat_nativeObj, IntPtr nn2_mat_nativeObj, IntPtr matches1to2_mat_nativeObj); } }