Descargue la versión correspondiente de opencv-contrib
Compilación CMake
Si hay errores, verifique el registro
Abra el archivo de registro y use la dirección para descargar el archivo desde el navegador.
Después de descargar el archivo, colóquelo en la ubicación correspondiente del archivo y modifique el nombre del archivo.
Ingrese la compilación de Vs
Acerca de la configuración de OpenCV4.0.1 + contrib cuando se ejecuta la solución "no se puede encontrar el punto de entrada del programa"
Solución
Copie todos los archivos de sufijo dll en ... \ opencv \ opencv_contrib \ x64 \ vc15 \ bin a C: \ Windows \ System32, el problema está resuelto.
Código de prueba
1 #include <opencv2 / opencv.hpp> 2 #include <opencv2 / xfeatures2d.hpp> 3 // #include <opencv2 /> 4 5 usando el espacio de nombres std; 6 usando el espacio de nombres cv; 7 8 int main () 9 { 10 cv :: Mat imageL = cv :: imread ( " origin_1.jpg " ); 11 cv :: Mat imageR = cv :: imread ( " origin_2.jpg " ); 12 / * imshow ("1", imageL); 13 imshow ("2", imageR); 14 waitKey (); 15 return 0; * / 16 17 18 19 // Método para extraer puntos de características 20 // SIFT 21 cv :: Ptr <cv :: xfeatures2d :: SIFT> sift = cv :: xfeatures2d :: SIFT :: create (); 22 // ORB 23 // cv :: Ptr <cv :: ORB> orb = cv :: ORB :: create (); 24 // SURF 25 // cv :: Ptr <cv :: xfeatures2d :: SURF> surf = cv :: xfeatures2d :: SURF :: create (); 26 27 // Punto de característica 28 std :: vector <cv :: KeyPoint> keyPointL, keyPointR; 29 // Extrae el punto de característica 30 por separado sift-> detect (imageL, keyPointL); 31 sift-> detect (imageR, keyPointR); 32 33 // 画 特征 点 34 cv :: Mat keyPointImageL; 35 cv :: Mat keyPointImageR; 36 drawKeypoints (imageL, keyPointL, keyPointImageL, cv :: Scalar :: all (- 1 ), cv :: DrawMatchesFlags :: DRAW_RICH_KEYPOINTS); 37 drawKeypoints (imageR, keyPointR, keyPointImageR, cv :: Scalar :: all (- 1 ), cv :: DrawMatchesFlags :: DRAW_RICH_KEYPOINTS); 38 39 // 显示 窗口 40 cv :: namedWindow ( " Puntos clave de imageL ", cv :: WINDOW_AUTOSIZE); 41 cv :: namedWindow ( " KeyPoints of imageR " , cv :: WINDOW_AUTOSIZE); 42 43 // Mostrar puntos de características 44 cv :: imshow ( " KeyPoints de imageL " , keyPointImageL); 45 cv: : imshow ( " KeyPoints of imageR " , keyPointImageR); 46 47 // Coincidencia de puntos de característica 48 cv :: Mat despL, despR; 49 // Extraer puntos de característica y calcular el descriptor de característica 50 sift-> detectAndCompute (imageL, cv :: Mat (), keyPointL, despL); 51 sift->detectAndCompute (imageR, cv :: Mat (), keyPointR, despR); 52 53 // Estructura para DMatch: índice de descriptor de consulta, índice de descriptor de tren, índice de imagen de tren y distancia entre descriptores. 54 // int queryIdx-> es la imagen de prueba El subíndice del descriptor de punto de característica (descriptor) también es el subíndice del punto de característica correspondiente (punto clave) del descriptor. 55 // int trainIdx -> es el índice del descriptor del punto de característica de la imagen de muestra, y también el índice del punto de característica correspondiente. 56 // int imgIdx-> útil cuando la muestra son múltiples imágenes. 57 // distancia flotante -> representa la distancia euclidiana de este par de descriptores de puntos característicos coincidentes (esencialmente vectores). Cuanto menor es el valor, más similares son los dos puntos característicos. 58 std :: vector <CV :: DMatch> Los partidos; 59 60 // Si es así método flannBased a diferentes tipos de necesidad orbe desp mediante la conversión de escribir 61 es SI(despL.type ()! = CV_32F || despR.type ()! = CV_32F) 62 { 63 despL.convertTo (Desplat, CV_32F); 64 despR.convertTo (después, CV_32F); 65 } 66 67 cv :: PTR <cv :: DescriptorMatcher> match = cv :: DescriptorMatcher :: create ( " FlannBased " ); 68 matcher-> match (Desplat, después, matches); 69 70 // 计算特征点距离的最大值 71 double maxDist = 0 ; 72 for ( int i = 0 ; i <despL.rows; i ++ ) 73 { 74 doble dist = coincide [i] .distance; 75 if (dist> maxDist) 76 maxDist = dist; 77 } 78 79 // 挑选 好的 匹配 点 80 std :: vector <cv :: DMatch> good_matches; 81 para ( int i = 0 ; i <despL.rows; i ++ ) 82 { 83 if (coincide con [i] .distance < 0.5 * maxDist) 84 { 85 good_matches.push_back (coincide con [i]); 86 } 87 } 88 89 90 91 cv :: Mat imageOutput; 92 cv :: drawMatches (imageL, keyPointL, imageR, keyPointR, good_matches, imageOutput); 93 94 cv :: namedWindow ( " imagen de coincidencia " , cv :: WINDOW_AUTOSIZE); 95 cv :: imshow ( " imagen de coincidencia " , imageOutput); 96 cv :: waitKey ( 0 ); 97 devuelve 0 ; 98 }