2017-11-08 1 views
0

Ich benutze SIFT-Deskriptor und FLANN Matcher, um den Mindestabstand der Übereinstimmungen zwischen zwei Bildern zu erhalten. Das erste Bild ist ein Abfragebild und das zweite Bild stammt aus dem Datensatz. Ich möchte das zweite Bild nacheinander mit einer Schleife laden, aber direkt nach der ersten Iteration stürzt das Programm nach der Anzeige des Ergebnisses der ersten Iteration zur Laufzeit ab und kann die zweite Iteration nicht aufrufen. Ich benutze opencv 2.4.13 und vs2017. Unten ist mein Code:opencv Programm Absturz nach übereinstimmenden Deskriptoren

#include "opencv2/highgui/highgui.hpp" 
#include "opencv2/imgproc/imgproc.hpp" 
#include "opencv2/nonfree/nonfree.hpp" 
#include "opencv2/nonfree/features2d.hpp" 
#include <opencv2/legacy/legacy.hpp> 

#include <iostream> 
#include <stdio.h> 
#include <algorithm> 
#include <vector> 

using namespace std; 
using namespace cv; 

#define IMAGE_folder "D:\\Project\\dataset1" // change to your folder location 

int main() 
{ 
    initModule_nonfree(); 
    const int filename_len = 900; 
    char tempname1[filename_len]; 
    sprintf_s(tempname1, filename_len, "%s\\%s", IMAGE_folder, "995.jpg"); 
    Mat i1 = imread(tempname1); 
    Mat img1, img2; 
    cvtColor(i1, img1, COLOR_BGR2GRAY); 

    if (!i1.data) 
    { 
     printf("Cannot find the input image!\n"); 
     system("pause"); 
     return -1; 
    } 

    std::vector<KeyPoint> key_points1, key_points2; 
    Mat descriptors1, descriptors2; 

    SIFT sift; 
    sift(img1, Mat(), key_points1, descriptors1); 

    for (int i = 990; i < 1000; i++) 
    { 
     initModule_nonfree(); 
     cout << i << endl; 
     char tempname2[filename_len]; 
     sprintf_s(tempname2, filename_len, "%s\\%d.jpg", IMAGE_folder, i); 
     Mat i2 = imread(tempname2); 
     if (!i2.data) 
     { 
      printf("Cannot find the input image!\n"); 
      system("pause"); 
      return -1; 
     } 
     cvtColor(i2, img2, COLOR_BGR2GRAY); 
     sift(img2, Mat(), key_points2, descriptors2); 

     FlannBasedMatcher matcher; 
     vector<DMatch> matches; 
     matches.clear(); 
     matcher.match(descriptors1, descriptors2, matches); //if I comment this line and the code below to show the distance, it can work 

     double max_dist = 0; 
     double min_dist = 100; 

     for (int j = 0; j < descriptors1.rows; j++) 
     { 
      double dist = matches[j].distance; 
      if (dist < min_dist) 
       min_dist = dist; 
      if (dist > max_dist) 
       max_dist = dist; 
     } 

     //matcher.clear(); //I've tried these four but still cannot help 
     //matches.clear(); 
     //key_points1.clear(); 
     //key_points2.clear(); 

     printf("-- Max dist : %f \n", max_dist); 
     printf("-- Min dist : %f \n", min_dist); 
     cout << "Done!" << endl; 
    } 

    //waitKey(0); 
    return 0; 
} 

ich viel ausprobiert habe und hier sind meine Probleme und Beobachtung:

  1. Es ist nicht, weil ich Iterationen verwenden. Wenn ich nur die matcher.match(descriptors1, descriptors2, matches); ausführen, wird es auch nach der Ausführung abstürzen.
  2. Es funktioniert auch nicht für SURF-Deskriptor oder BruteForceMatcher, beide haben das gleiche Problem mit dem obigen Code. Ich habe verschiedene Teile von Code von opencv Tutorial mit SURF verwendet, und es stürzt immer noch nach der Anzeige des Ergebnisses. Example code from opencv tutorial see here
  3. Ich habe auch versucht initModule_nonfree(); wie einige Antworten gesagt, aber immer noch nicht geholfen.
  4. Das Programm stürzt ab, nachdem "Done!" und nicht in die nächste Iteration eintreten.
  5. Wenn ich den matcher.match(descriptors1, descriptors2, matches); und den entsprechenden Code unten lösche, kann es richtig funktionieren. Also muss das Problem mit der "Match" -Funktion sein.

Vielen Dank im Voraus!

----------------------------- aktualisiert ---------------- -------------

Meine enthält und verknüpfte Bibliotheken sind nachfolgend dargestellt:

C: \ Program Files (x86) \ opencv \ bauen \ include C: \ Program Files (x86) \ opencv \ \ bauen umfassen \ opencv C: \ Program Files (x86) \ opencv \ bauen \ include \ opencv2

C: \ Program Files (x86) \ opencv \ bauen \ x64 \ VC12 \ staticlib C: \ Programme (x86) \ opencv \ build \ x64 \ vc12 \ lib

opencv_objdetect2413.lib opencv_ts2413.lib opencv_video2413.lib opencv_nonfree2413.lib opencv_ocl2413.lib opencv_photo2413.lib opencv_stitching2413.lib opencv_superres2413.lib opencv_videostab2413.lib opencv_calib3d2413.lib opencv_contrib2413.lib opencv_core2413.lib opencv_features2d2413.lib opencv_flann2413.lib opencv_gpu2413.lib opencv_highgui2413.lib opencv_imgproc2413.lib offen cv_legacy2413.lib opencv_ml2413.lib

Ich denke, die Konfiguration kann keine Probleme haben ... Ich benutze es im Freigabemodus unter x86, danke!

+0

Zeigen enthält und verlinkte libs – Miki

+0

Zu meiner Frage hinzugefügt, danke! – Wendy

+0

Sie verknüpfen mit 64-Bit-Bibliotheken, bauen mit VC12 (Visual Studio 2013). Offensichtlich funktioniert das nicht – Miki

Antwort

0

Ich habe das Problem herausgefunden. Der Code funktioniert für opencv2.4.13 und vs2012 statt vs2017. Vielleicht liegt es daran, dass opencv2.4.13 nicht mit vs2017 kompatibel ist.