c++ - OpenCV:使用 ORB 比较多个图像

标签 c++ opencv orb

我正在尝试创建一个 C++ 程序,其中与一个输入图像相比,列表中有很 multimap 像。我让整个工作正常,程序正在创建 DMatch 匹配项。

现在我试图确定与源图像比较的图像列表中的哪一个是最佳匹配。我首先尝试通过比较图像之间有多少匹配来做到这一点,但问题是当生成的图像有很多关键点时;他们也往往有很多匹配项,至少在我的程序中是这样。

那么我怎样才能确定图像数组中的哪一个与源图像最匹配呢?我正在使用此循环来确定匹配项,但它实际上不起作用:

vector< vector<DMatch> > filteredMatches;
vector<int> goodIds;
Ptr<DescriptorMatcher> matcher(new BFMatcher(NORM_HAMMING, false));

printf("bad matches: ");

for(size_t i = 0; i < images.size();i++){
    vector<DMatch> matches, good_matches;

    matcher->clear();
    matcher->match(images[i], tex_des, matches);
    if(matches.size() < 8){
        printf("F%d,", (int)i + 1);
        continue;
    }

    double min_dist = 100;

    for(size_t j = 0; j < matches.size(); j++ ){ 
        double dist = matches[j].distance;
        if( dist < min_dist ) 
            min_dist = dist;
    }

    if(min_dist > 50.0){
        printf("D%d,", (int)i + 1);
        continue;
    }

    double good_dist = min_dist * 3;
    for(size_t j = 0; j < matches.size(); j++ ){
        if(matches[j].distance < good_dist)
            good_matches.push_back(matches[j]);
    }

    size_t size = good_matches.size();
    if(size < 8){
        printf("M%d,", (int)i + 1);
        continue;
    }

    vector<Point2f> srcPoints(size);
    vector<Point2f> dstPoints(size);

    for(size_t j = 0; j < size; j++){
        srcPoints[j] = destination[good_matches[j].trainIdx].pt;    
        dstPoints[j] = keyPoints[i][good_matches[j].queryIdx].pt;   
    }

    vector<unsigned char> inliersMask(srcPoints.size());
    Mat H = findHomography(srcPoints, dstPoints, CV_FM_RANSAC, 3.0, inliersMask);

    vector<DMatch> inliers;
    for(size_t j = 0; j < inliersMask.size(); j++){
        if(inliersMask[j]){
            inliers.push_back(good_matches[j]);
        }
    }
    if(inliers.size() < 4){
        printf("S%d,", (int)i + 1);
        continue;
    }

    filteredMatches.push_back(inliers);
    goodIds.push_back((int)i);

    H.release();
}

printf(" good matches: ");

int best = -1;
int amount = 0;
for(size_t i = 0; i < filteredMatches.size(); i++){
    int size = (int)filteredMatches.at(i).size();
    if(size < 8) continue;

    printf("%d,", goodIds[i] + 1);

    if(amount < size){
        amount = size;
        best = i;
    }
}

if(best >= 0) printf(" best match on image: %d, keypoints: %d, ", goodIds[best] + 1, amount);

如果有人能指出我必须使用的功能或逻辑,我将不胜感激!

最佳答案

这取决于列表中的图像是什么。世界上的每一个视力问题都不可能只有一种解决方案。例如,我从事的项目需要识别墙壁图片中的 Material 。您不能只将它与不同 Material 的不同图片进行比较,并希望得到匹配。

就我而言,我需要创建描述符。 Descriptors是输出值可以与另一张图片的其他值进行比较的算法。 openCV中已经有很多描述子了,比如LBP、SURF等。简单来说,你不再比较图像了,你比较图像1的描述符输出值和所有图像的描述符值列表中的图像。

您需要找出您的眼睛/大脑用来在现实生活中找到匹配项的描述符。例如,如果匹配基于颜色,则可以使用 CLD 或 DCD。如果匹配基于纹理,则使用 LBP。您也可以像我在我的项目中所做的那样,使用大量描述符并使用机器学习和经过训练的数据算法来找到最佳匹配。

总而言之,没有可以解决所有视力问题的 Elixir 。您需要根据问题调整解决方案。

希望对您有所帮助!

关于c++ - OpenCV:使用 ORB 比较多个图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15202628/

相关文章:

c++ - CLion 2017.1 CMake 在mac OS10.12 上编译报错

c++ - 加载 vector 到 SSE 寄存器

c++ - Visual Studio 2008 (C++) 内存泄漏检测不显示文件/方法位置 - 如何让它工作?

python - 如何在python中 reshape 图像的128 d矢量

python - 为什么重新计算 ORB 描述符比从磁盘加载它更快?

java - OpenCV 过滤 ORB 匹配项

c++ - 如何在 C 中找到结构体/函数的父头文件?

c - 如何近似灰度图像中的线段?

python - 为什么OpenCV for Python 的cv2.HoughLines 的返回值需要通过索引访问?

opencv - 如何使用特征(ORB)在对象周围绘制矩形