OpenCV drawMatches错误 [英] OpenCV drawMatches error

查看:5298
本文介绍了OpenCV drawMatches错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的代码包含一个部分,其中我通过一组匹配进行排序,并根据距离定义好的匹配。当我尝试drawMatches,我收到一个错误:

My code consists of a section where I sort through a set of matches and define good matches based on distance. When I try to drawMatches, I receive an error:

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



draw.cpp文件显示: / p>

draw.cpp file shows:

// draw matches
for( size_t m = 0; m < matches1to2.size(); m++ )
{
     if( matchesMask.empty() || matchesMask[m] )
     {
          int i1 = matches1to2[m].queryIdx;
          int i2 = matches1to2[m].trainIdx;
          CV_Assert(i1 >= 0 && i1 < static_cast<int>(keypoints1.size()));
          CV_Assert(i2 >= 0 && i2 < static_cast<int>(keypoints2.size()));
          const KeyPoint &kp1 = keypoints1[i1], &kp2 = keypoints2[i2];
          _drawMatch( outImg, outImg1, outImg2, kp1, kp2, matchColor, flags );
     }
}

我的drawMatches调用如下:

My drawMatches call follows:

Mat matchesImage;

drawMatches( im1, keypoints1, im2, keypoints2,
    good_matches, matchesImage, Scalar::all(-1), Scalar::all(-1),
    vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS );

任何人都可以帮我解释这个错误吗?

Can anybody help explain this error to me?

更新:

这是我的good_matches计算代码

Here is my code for the good_matches calculation

double min_dist = 10000;
double max_dist = 0;

//-- Quick calculation of max and min distances between keypoints
for( int i = 0; i < descriptors1.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 );

//-- Draw only "good" matches
std::vector< DMatch > good_matches;

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

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 ); 
}

cout << "number of good matches: " << (int)good_matches.size() << endl;;

//Draw matches and save file
Mat matchesImage;

drawMatches( im1, keypoints1, im2, keypoints2,
    good_matches, matchesImage, Scalar::all(-1), Scalar::all(-1),
    vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS );

更新2:

BFMatcher matcher(NORM_L2, true);
vector<DMatch> matches;
matcher.match(descriptors1, descriptors2, matches);


推荐答案

一般来说,good_matches是一个数组,来自 keypoints1 keypoints2 数组。所以指向 keypoints1 [good_matches [m] .queryIdx] 对应于点 keypoints2 [good_matches [m] .trainIdx]
正如你所看到的,opencv代码中的断言是有意义的。

In general, good_matches is an array, which binds points from both keypoints1 and keypoints2 array. So point keypoints1[good_matches[m].queryIdx] corresponds to point keypoints2[good_matches[m].trainIdx]. As you can see, assertions in opencv code have sense.

看来,问题出现在匹配数组中。

It seems, the problem is in matches array.

这篇关于OpenCV drawMatches错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆