我有一个程序,它将模板图像中的特征点与视频源中显示的特征点相匹配.当我运行该程序时,我收到以下错误:
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
这是上面提到的函数drawMatches:
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);
根据我的阅读,我认为问题是如果视频中找到的特征点与模板图像中的特征点不匹配,那么程序就会中止.
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]);
}
}
即使没有匹配,我也在寻找能够持续运行的视频源.
编辑:
我注意到如果我反复尝试运行该程序,我有时会得到另一个错误消息:
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
最佳答案 在以下之后:
extractor.compute(img_1, keypoints_1, descriptors_1);
extractor.compute(frame, keypoints_2, descriptors_2);
请添加:
if ((descriptors_1.empty()) || (descriptors_2.empty()))
continue;
由于在特定帧中没有找到关键点,因此应该转到下一次迭代并检查新帧.
这解决了我的问题.