在openCV中,我已经在我的应用程序中修改了这个教程代码
我一直试图使用最近邻距离比率修剪匹配,只能绘制超过某个阈值的匹配。
double ratio = 0.9;
std::vector< vector<DMatch > > nnMatches;
std::vector< DMatch > good_NNmatches;
matcher.knnMatch(descriptors_scene, descriptors_object, nnMatches, 2 );
for(int k = 0; k < nnMatches.size(); k++)
{
if(nnMatches[k][0].distance / nnMatches[k][1].distance > ratio)
{
good_NNmatches.push_back(nnMatches[k][0]);
}
}
然后我尝试使用教程中演示的相同方法在good_NNmatches中绘制匹配但是我收到以下错误:
OpenCV Error: Assertion failed (i1 >= 0 && i1 < static_cast<int>(keypoints1.size())) in drawMatches, file /Users/cgray/Downloads/opencv-2.4.6/modules/features2d/src/draw.cpp, line 207
libc++abi.dylib: terminating with uncaught exception of type cv::Exception: /Users/cgray/Downloads/opencv-2.4.6/modules/features2d/src/draw.cpp:207: error: (-215) i1 >= 0 && i1 < static_cast<int>(keypoints1.size()) in function drawMatches
当尝试使用good_nnMatches而不是good_matches调用drawMatches时,如教程中所述。
drawMatches( roiImg, keypoints_object, compare, keypoints_scene,
good_NNmatches, img_matches, Scalar::all(-1), Scalar::all(-1),
vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS );
答案 0 :(得分:1)
我遇到了同样的问题。就我而言,我正在做
cv::Mat output;
drawMatches( smallimg, keyptsSm, bigimg, keyptsBg, matchesBig2Small, output );
匹配matchesBig2Small
的计算位置从bigimg
到smallimg
std::vector<cv::DMatch> matchesBig2Small;
//match from bigimg to smallimg
所以你得到的错误实际上是说它正在寻找smallimg
中实际引用第二个图像的关键点索引,这个图像更大,所以你超过了smallimg
的大小。因此,要么将对drawMatches
的调用更改为:
drawMatches( bigimg, keyptsBg, smallimg, keyptsSm, matchesBig2Small, output );
或者将您计算匹配的方式更改为smallimg
到bigimg
,因此您需要matchesBig2Small
代替matchesSmall2Big
,然后才能调用将是:
std::vector<cv::DMatch> matchesSmall2Big;
//match from smallimg to bigimg
drawMatches( smallimg, keyptsSm, bigimg, keyptsBg, matchesSmall2Big, output );
答案 1 :(得分:0)
在经过一些试验和错误后,我似乎已经解决了这个问题。
我更改了drawMatches方法,将“roiImg”和关键点与“compare”和关键点交换。
drawMatches(compare, keypoints_scene, roiImg, keypoints_object,
good_NNmatches, img_matches, Scalar::all(-1), Scalar::all(-1),
vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS );
这停止了断言错误。但是由于在检索关键点时交换了值,我还必须进行一些更改。 trainIdx和queryIdx也已被交换以考虑先前所做的更改。
obj.push_back( keypoints_object[ good_NNmatches[i].trainIdx ].pt );
scene.push_back( keypoints_scene[ good_NNmatches[i].queryIdx ].pt );
答案 2 :(得分:0)
我做到了,我没有任何问题 我希望这段代码可以帮到你
double NNDR;
for(int i=0;i<(int)ORB_ORB_matches.size(); i++){
NNDR= ( ORB_ORB_matches[i][0].distance/ORB_ORB_matches[i][1].distance );
if(NNDR <= 0.9){
ORB_single_matches.push_back (ORB_ORB_matches[i][0]);
}
}
drawMatches( image_1, keypoints_1, image_2, keypoints_2, ORB_single_matches, img_matches,Scalar::all(-1),Scalar::all(-1),vector<char>(),`enter code here` DrawMatchesFlags::DRAW_RICH_KEYPOINTS|DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);