сбой программы opencv после сопоставления дескрипторов

Я использую SIFT дескриптор и FLANN matcher, чтобы получить минимальное расстояние совпадений между двумя картинками. Первое изображение — это изображение запроса, а второе — из набора данных. Я хочу загрузить второе изображение одно за другим, используя цикл, но сразу после первой итерации программа вылетает во время выполнения после отображения результата первой итерации и не может войти во вторую итерацию. Я использую opencv 2.4.13 и vs2017. Ниже мой код:

#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;
}

Я много пробовал и вот мои проблемы и наблюдения:

  1. Это не потому, что я использую итерации. Если бы я только запустить matcher.match(descriptors1, descriptors2, matches); , он также потерпит крах после выполнения.
  2. Это также не работает для дескриптора SURF или BruteForceMatcher, оба имеют одинаковую проблему с кодом выше. Я использовал разные фрагменты кода из учебника opencv с использованием SURF, и он по-прежнему вылетает после отображения результата. Пример кода из учебника opencv смотрите здесь
  3. Я также пытался initModule_nonfree(); как сказали некоторые ответы, но все равно не помогло.
  4. Программа вылетает после отображения «Готово!» и не входя в следующую итерацию.
  5. Если я удалю matcher.match(descriptors1, descriptors2, matches); и соответствующий код ниже, он может работать должным образом. Так что проблема должна быть с функцией «соответствия».

Заранее большое спасибо!

——————————обновлено ——————————

Мои включенные и связанные библиотеки показаны ниже:

C: \ Program Files (x86) \ opencv \ build \ include
C: \ Program Files (x86) \ opencv \ build \ include \ opencv
C: \ Program Files (x86) \ opencv \ build \ include \ opencv2

C: \ Program Files (x86) \ opencv \ build \ x64 \ vc12 \ staticlib
C: \ Program Files (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
opencv_legacy2413.lib
opencv_ml2413.lib

Я думаю, что конфигурация может не иметь проблем … Я использую его в режиме релиза под x86, спасибо!

0

Решение

Я обнаружил проблему. Код работает для opencv2.4.13 и vs2012 вместо vs2017. Может быть, это только потому, что opencv2.4.13 не совместим с vs2017.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector