2016-04-25 12 views
0

Ich versuche, ein Programm zu schreiben, das ORB-Algorithmus verwendet, um die Schlüsselpunkte eines Bildes zu erkennen und zu berechnen und Deskriptor-Vektoren mit FLANN Matcher. Das Problem, mit dem ich konfrontiert bin, ist, dass jedes Mal, wenn ich das Programm auf Visual C++ ausführen, ein Fehler, dass "Vektorindex außerhalb des Bereichs" (Ich habe auch ein Bild des Fehlers beigefügt).Vektor-Index außerhalb des Bereichs Fehler in C++ und Opencv

Das Problem scheint irgendwo in der for zu sein, denn wenn ich den Debugger starte, stoppt es dort und ich bekomme den Fehler. Als ich den ersten Kommentar abgegeben habe, um zu sehen, ob der Rest in Ordnung ist, habe ich den gleichen Fehler beim zweiten.

Bitte helfen Sie mir, das Problem zu finden.

#include <iostream> 
#include <stdio.h> 
#include <opencv2/opencv.hpp> 
#include <opencv2/features2d.hpp> 
#include <opencv2\core\types.hpp> 
#include <opencv2\highgui.hpp> 
#include <opencv2\core.hpp> 
#include <opencv2\opencv_modules.hpp> 

using namespace cv; 
using namespace std; 


int main() 
{ 


Mat img1 = imread("C:\\Users\\patri\\Desktop\\test.bmp"); 
Mat img2 = imread("C:\\Users\\patri\\Desktop\\test3.bmp"); 
/* 
if (!img1.data || !img2.data) 
{ 
    printf(" --(!) Error reading images \n"); return -1; 
} 
*/ 
std::vector<KeyPoint> keypoints_1, keypoints_2; 

Mat descriptors_1, descriptors_2; 

Ptr<ORB> orb = ORB::create(100, 2, 8, 31, 0, 2, ORB::HARRIS_SCORE, 31, 20); 

orb->detectAndCompute(img1, Mat(), keypoints_1, descriptors_1); 
orb->detectAndCompute(img2, Mat(), keypoints_2, descriptors_2); 

std::cout << "Found " << keypoints_1.size() << " Keypoints " << std::endl; 
std::cout << "Found " << keypoints_2.size() << " Keypoints " << std::endl; 

Mat out1, out2; 
drawKeypoints(img1, keypoints_1, out1, Scalar::all(255)); 
drawKeypoints(img2, keypoints_2, out2, Scalar::all(255)); 

imshow("Kpts1", out1); 
imshow("Kpts2", out2); 
////////////////////////////////////////////////////////////////////// 
// Matching descriptor vectors using FLANN matcher 

FlannBasedMatcher matcher; 
std::vector<DMatch> matches; 
//matcher.match(descriptors_1, descriptors_2, matches); 


double max_dist = 0; double min_dist = 100; 

//calculation of max and min distances between keypoints 
for (int i = 0; i < descriptors_1.rows; i++) 
{ 
    double dist = matches[i].distance; 
    if (dist < min_dist) min_dist = dist; 
    if (dist > max_dist) max_dist = dist; 
} 

printf("-- Max dist : %f \n", max_dist); 
printf("-- Min dist : %f \n", min_dist); 


std::vector<DMatch> good_matches; 

for (int i = 0; i < descriptors_1.rows; i++) 
{ 
    if (matches[i].distance <= max(2 * min_dist, 0.02)) 
    { 
     good_matches.push_back(matches[i]); 
    } 
} 

//-- Draw only "good" matches 
Mat img_matches; 
drawMatches(img1, keypoints_1, img2, keypoints_2, 
    good_matches, img_matches, Scalar::all(-1), Scalar::all(-1), 
    vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS); 

//-- Show detected matches 
imshow("Good Matches", img_matches); 

for (int i = 0; i < (int)good_matches.size(); i++) 
{ 
    printf("-- Good Match [%d] Keypoint 1: %d -- Keypoint 2: %d \n", i, good_matches[i].queryIdx, good_matches[i].trainIdx); 
} 

waitKey(0); 

return 0; 
} 

der Fehler Ich bin

+0

'std :: vector < DMatch > Streichhölzer;' ist leer, aber sie versuchen, ihre Elemente zuzugreifen in der for-Schleife. –

Antwort

0

std::vector<DMatch> matches; immer leer, aber sie versuchen, ihre Elemente in der for-Schleife zuzugreifen.

std::vector<DMatch> matches;//this creates an empty vector 
//you need to push_back some elements in matches before trying to access it in your loops 
...... 

//calculation of max and min distances between keypoints 
for (int i = 0; i < descriptors_1.rows; i++) 
{ 
    double dist = matches[i].distance;//this is trying to access the empty vector 
    ...... 
} 
+0

Vielen Dank! – patri

0

Ich denke, die Vektorvariable good_matches 0 Größe Elemente aufweisen kann, kann das Problem Code verbergen:

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