ORB特征点检测和匹配

来源:互联网 发布:淘宝助理有什么功能 编辑:程序博客网 时间:2024/05/18 16:39
#include <stdio.h>#include <iostream>#include "opencv2/core/core.hpp"#include "opencv2/features2d/features2d.hpp"#include "opencv2/highgui/highgui.hpp"#include <iostream>#include <vector>#include <QtDebug>using namespace cv;using namespace std;char* image_filename2 = "F:/opencv-3.1.0/pictures/test2.bmp";char* image_filename1 = "F:/opencv-3.1.0/pictures/test1.bmp";int main( int argc, char** argv ){    Mat img_1 = imread(image_filename2);    Mat img_2 = imread(image_filename1);    if (!img_1.data || !img_2.data)    {        cout << "error reading images " << endl;        return -1;    }    //ORB orb;    Ptr<ORB> orb = ORB::create(500,1.2f,8,31,0,2,ORB::HARRIS_SCORE,31,20);    vector<KeyPoint> keyPoints_1, keyPoints_2;    Mat descriptors_1, descriptors_2;#if 0    orb->detect(img_1,keyPoints_1, Mat());    for(int i=0;i<keyPoints_1.size();i++)    {        qDebug("keypoint[%d] x:%f y:%f size:%d angle:%f\n", i, keyPoints_1[i].pt.x, keyPoints_1[i].pt.y, keyPoints_1[i].size, keyPoints_1[i].angle);    }#endif    orb->detectAndCompute(img_1, Mat(), keyPoints_1, descriptors_1);    orb->detectAndCompute(img_2, Mat(), keyPoints_2, descriptors_2);    qDebug("keyPoints1 size:%d\n", keyPoints_1.size());    qDebug("keyPoints2 size:%d\n", keyPoints_2.size());    flann::Index flannIndex(descriptors_2,flann::LshIndexParams(20,10,2),cvflann::FLANN_DIST_HAMMING);    Mat matchIndex(descriptors_1.rows,2,CV_32SC1),                matchDistance(descriptors_1.rows,2,CV_32FC1);    flannIndex.knnSearch(descriptors_1,matchIndex,matchDistance,2,flann::SearchParams());    int goodMatchsNum=0;    std::vector< DMatch > good_matches;    for(int i=0;i<matchDistance.rows;i++)    {       if (matchDistance.at<float>(i,0)<0.6*matchDistance.at<float>(i,1))       {           DMatch dmatches(i,matchIndex.at<int>(i,0),               matchDistance.at<float>(i,0));           good_matches.push_back( dmatches);           goodMatchsNum++;       }    }    cout<<goodMatchsNum<<endl;    //-- Draw only "good" matches    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 );    //-- Show detected matches    imshow( "Good Matches", img_matches );    for( int i = 0; i < good_matches.size(); i++ )    { qDebug( "-- Good Match [%d] Keypoint 1: %d  -- Keypoint 2: %d  \n", i, good_matches[i].queryIdx, good_matches[i].trainIdx ); }    waitKey(0);    return 0; }

原创粉丝点击