OpenCV图像相似度ORB算法(图像特征比对)

2025-10-04 05:14:35

1、引入必要的头文件:

#include <iostream>

#include "opencv2/core/core.hpp"

#include "opencv2/features2d/features2d.hpp"

#include "opencv2/highgui/highgui.hpp"

#include "opencv2/nonfree/nonfree.hpp"

#include "opencv2/nonfree/features2d.hpp"

2、声明命名空间:

using namespace std;

using namespace cv;

3、声明函数:

int getORB(char * imagePatha,char * imagePathb);

4、添加函数:

int getORB(char * imagePatha,char * imagePathb){

   double t;

   t=getTickCount();

   Mat img_1 = imread(imagePatha);

   Mat img_2 = imread(imagePathb);

   if (!img_1.data || !img_2.data)   {

      cout << "error reading images " << endl;      return -1;

   }

   ORB orb;

   vector<KeyPoint> keyPoints_1, keyPoints_2;

   Mat descriptors_1, descriptors_2;

   orb(img_1, Mat(), keyPoints_1, descriptors_1);

   orb(img_2, Mat(), keyPoints_2, descriptors_2);

   BruteForceMatcher<HammingLUT> matcher;

   vector<DMatch> matches;

   matcher.match(descriptors_1, descriptors_2, matches);

   double max_dist = 0; double min_dist = 100;

   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 < 0.6*max_dist ){

      good_matches.push_back(matches[i]);

      }

   }

  t=getTickCount()-t;

  t=t*1000/getTickFrequency();

  Mat img_matches;

  drawMatches(img_1, keyPoints_1, img_2, keyPoints_2,good_matches, img_matches,

   Scalar::all(-1), Scalar::all(-1),vector<char>(),

   DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);

  imshow( "Match", img_matches);   

  printf( "%f ms\n", t );

  cvWaitKey(0);

  return 0;

}

5、调用:

 getORB("/home/chery/eyesame/1.jpg","/home/chery/eyesame/2.jpg");

即可返回相似度比较的图像。

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢