Reputation: 5013
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
Upvotes: 4
Views: 892
Reputation: 36
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.
Upvotes: 2