简体   繁体   中英

OpenCV - match SURF points runtime error

I have a program which matches feature points found in a template image to those shown in the video feed. When I run the program I am getting the following error:

OpenCV Error: Assertion failed (i1 >= 0 && i1 < static_cast<int>(keypoints1.size())) in drawMatches, file bin/opencv-2.4.7/modules/features2d/src/draw.cpp, line 207
terminate called after throwing an instance of 'cv::Exception'
  what():  bin/opencv-2.4.7/modules/features2d/src/draw.cpp:207: error: (-215) i1 >= 0 && i1 < static_cast<int>(keypoints1.size()) in function drawMatches

Aborted

This is the function drawMatches that is mentioned above:

drawMatches(img_1, templateKeypoints, frames, keypoints_1, good_matches, img_matches, cv::Scalar::all(-1), cv::Scalar::all(-1), std::vector<char>(), cv::DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);

From what I've read I believe the problem is to do with if the feature points found in the video do not match the feature points in the template image then the program is aborting.

min_dist = 100;      
for(int i = 0; i < img_descriptors_1.rows; i++) {
        if(matches[i].distance <= 3 * min_dist) {
          good_matches.push_back(matches[i]);
        }
      }

I am looking for the video feed to run constantly even if no matches are present.

EDIT:

I've noticed if I repeatedly try to run the program I sometimes get an alternative error message:

OpenCV Error: Assertion failed (npoints >= 0 && points2.checkVector(2) == npoints && points1.type() == points2.type()) in findHomography, file /home/colin/bin/opencv-2.4.7/modules/calib3d/src/fundam.cpp, line 1074
terminate called after throwing an instance of 'cv::Exception'
  what():  /home/colin/bin/opencv-2.4.7/modules/calib3d/src/fundam.cpp:1074: error: (-215) npoints >= 0 && points2.checkVector(2) == npoints && points1.type() == points2.type() in function findHomography

Aborted

Just after the following:

extractor.compute(img_1, keypoints_1, descriptors_1);
extractor.compute(frame, keypoints_2, descriptors_2);

please add this:

if ((descriptors_1.empty()) || (descriptors_2.empty()))
continue;

Since no keypoints are found in the particular frame, it should go to the next iteration and check for a new frame. This solved my problem.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM