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

 时间:2024-10-12 01:14:43

1、引入必要的头文件:#include <iostream> #include "opencv2/core/core.hpp" #inc造婷用痃lude "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");即可返回相似度比较的图像。

  • linux 命令终端提示符显示-bash-4.1#解决方法
  • 凤凰系统怎么设置分辨率
  • Symantec企业版如何设置USB只读不可写功能策略
  • 虚拟机安装panabit图解教程(二)
  • Win7系统开机滚动条循环无法进入系统怎么办
  • 热门搜索
    平安校园手抄报内容 武汉手抄报 三爱手抄报内容 a4手抄报版面设计图 数学手抄报内容大全 清明节手抄报花边 爱国诚信友善手抄报 庆元旦手抄报内容 元旦节手抄报一等奖 有关书的手抄报