没有时,ORB / BruteForce绘图匹配

时间:2016-05-17 16:39:57

标签: c++ opencv brute-force orb

我试图编写一个程序,使用ORB算法来检测和计算图像和视频的关键点,并使用BruteForce匹配器匹配描述符向量。我面临的问题是,每当我在Visual C ++上运行程序时,当我试图检测的对象不可见时,我的算法就是在检测到的关键点之间绘制所有假定的匹配线(它匹配所有关键点)。当我试图检测到的物体出现在图像中时,我不会面对这个问题,事实上,我几乎没有任何不匹配。

这是主要测试的简短序列:

•将输入图像转换为灰度

•将输入视频转换为灰度

•检测关键点并从输入灰度图像中提取描述符

•检测关键点并从输入灰度视频中提取描述符

•匹配描述符(见下文)

BFMatcher matcher(NORM_HAMMING);
    vector<DMatch> matches;
    matcher.match(descriptors_1, descriptors_2, matches);

    double max_dist = 0; double min_dist = 100;

    ////calcularea distantelor max si min distances intre keypoints
    for (int i = 0; i < descriptors_1.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);


    std::vector< DMatch > good_matches;

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

    ////-- Desenarea matches-urilor "bune"
    Mat img_matches;
    drawMatches(img1, keypoints_1, cadruProcesat, keypoints_2,
        good_matches, img_matches, Scalar::all(-1), Scalar::all(-1),
        vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);

    ////-- Afisare matches
    imshow("good matches", img_matches);
    int gm = 0;
    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);
        gm += 1;
    }

    printf("%d",gm);
    ///////////////////////////////////////////////////////////////////
    //imshow(windowName2, cadruProcesat);

    switch (waitKey(10)) {

    case 27:
        //tasta 'esc' a fost apasata(ASCII 27) 
        return 0;
    }
}

return 0;

请帮我找到问题。

1 个答案:

答案 0 :(得分:0)

所以我将min_dist的值改为15(不是100),似乎它对模式的效果非常好......但这是通过反复试验来完成的......