• ORB对齐


      1 //#include "pch.h"   //opencv4.0要去掉
      2 #include <iostream>
      3 #include <stdlib.h>
      4 #include <opencv2/imgproc.hpp>
      5 #include <opencv2/opencv.hpp>
      6 #include "opencv2/xfeatures2d.hpp"
      7 #include "opencv2/features2d.hpp"
      8 
      9 using namespace std;
     10 using namespace cv;
     11 using namespace cv::xfeatures2d;
     12 
     13 //最大特征点数
     14 const int MAX_FEATURES = 500;
     15 //好的特征点数
     16 const float GOOD_MATCH_PERCENT = 0.15f;
     17 
     18 /**
     19 * @brief 图像对齐
     20 *
     21 * @param im1 对齐图像
     22 * @param im2 模板图像
     23 * @param im1Reg 输出图像
     24 * @param h
     25 */
     26 void alignImages(Mat &im1, Mat &im2, Mat &im1Reg, Mat &h) //引用传递,传入是实参的的别名,实际是实参的地址,因此调用被调函数后,实参会被间接修改。,这么看:Mat& arg
     27 //和函数的 值传递 相反。
     28 {
     29     // Convert images to grayscale
     30     Mat im1Gray, im2Gray;
     31     //转换为灰度图
     32     cvtColor(im1, im1Gray, COLOR_BGR2GRAY);   //opencv4.0这里CV_BGR2GRAY要改成COLOR_BGR2GRAY
     33     cvtColor(im2, im2Gray, COLOR_BGR2GRAY);
     34 
     35     // Variables to store keypoints and descriptors
     36     //关键点
     37     std::vector<KeyPoint> keypoints1, keypoints2;//定义装有KeyPoint数据类型的的数组变量, keypoints1, keypoints2。如:vector<int> x,y
     38     //特征描述符
     39     Mat descriptors1, descriptors2;
     40 
     41     // Detect ORB features and compute descriptors. 计算ORB特征和描述子
     42     Ptr<Feature2D> orb = ORB::create(MAX_FEATURES);//opencv中ORB函数是纯虚函数,继承自feature2D,无法通过实例化对象调用,只能通过指针调用。
     43     orb->detectAndCompute(im1Gray, Mat(), keypoints1, descriptors1);
     44     orb->detectAndCompute(im2Gray, Mat(), keypoints2, descriptors2);
     45 
     46     // Match features. 特征点匹配
     47     std::vector<DMatch> matches;
     48     //汉明距离进行特征点匹配
     49     Ptr<DescriptorMatcher> matcher = DescriptorMatcher::create("BruteForce-Hamming");//虚函数调用
     50     matcher->match(descriptors1, descriptors2, matches, Mat());
     51 
     52     // Sort matches by score 按照特征点匹配结果从优到差排列
     53     std::sort(matches.begin(), matches.end());
     54 
     55     // Remove not so good matches 移除不好的特征点
     56     const int numGoodMatches = matches.size() * GOOD_MATCH_PERCENT;
     57     matches.erase(matches.begin() + numGoodMatches, matches.end());//0.15*matchPoints_size
     58 
     59     // Draw top matches
     60     Mat imMatches;
     61     //画出特征点匹配图
     62     drawMatches(im1, keypoints1, im2, keypoints2, matches, imMatches);
     63     imwrite("matches.jpg", imMatches);             //暴力匹配后剔除差的匹配点后 打印的特征点匹配关系图
     64 
     65                                                    // Extract location of good matches
     66     std::vector<Point2f> points1, points2;
     67 
     68     //保存对应点
     69     for (size_t i = 0; i < matches.size(); i++)   //这里是暴力匹配作剔除后剩下的点
     70     {
     71         //queryIdx是对齐图像的描述子和特征点的下标。
     72         points1.push_back(keypoints1[matches[i].queryIdx].pt);
     73         //queryIdx是是样本图像的描述子和特征点的下标。
     74         points2.push_back(keypoints2[matches[i].trainIdx].pt);
     75     }
     76 
     77     // Find homography 计算Homography,RANSAC随机抽样一致性算法
     78     h = findHomography(points1, points2, RANSAC);//这个函数参数远比这个多,很多省略了,输入两张图片各自匹配点的矩阵,和匹配方法
     79 
     80     // Use homography to warp image 映射   
     81     warpPerspective(im1, im1Reg, h, im2.size()); //弯曲视角,(待配准图,结果图,单应矩阵,)
     82 }
     83 
     84 int main()
     85 {
     86     // Read reference image 读取参考图像
     87     string refFilename("D://aa.jpg");        //基准图像
     88     cout << "Reading reference image : " << refFilename << endl;
     89     Mat imReference = imread(refFilename);
     90 
     91     // Read image to be aligned 读取对准图像
     92     string imFilename("D://a.jpg");   //待校准图像
     93     cout << "Reading image to align : " << imFilename << endl;
     94     Mat im = imread(imFilename);
     95 
     96     // Registered image will be resotred in imReg.
     97     // The estimated homography will be stored in h.
     98     //结果图像,单应性矩阵
     99     Mat imReg, h;
    100 
    101     // Align images
    102     cout << "Aligning images ..." << endl;
    103     alignImages(im, imReference, imReg, h);//(待配准图,参照图,结果图,单应矩阵)
    104 
    105     // Write aligned image to disk.
    106     string outFilename("aligned.jpg");   
    107     cout << "Saving aligned image : " << outFilename << endl;
    108     imwrite(outFilename, imReg);  //校准后图像
    109 
    110     /* Print estimated homography          
    111     [0.4260230318277862, 2.205599317460628, 7.436838081684622;
    112     -0.8418214464779903, 1.649310552258939, 1202.559886226323;
    113     0.0003634828675145606, 0.001245337973396314, 1]*/
    114     cout << "Estimated homography : 
    " << h << endl; //这里输出到控制台了,要想保存需要输出重定向
    115     system("pause");
    116     return 0;
    117 }
    118  
  • 相关阅读:
    Eclipse下搭建Django环境
    在pycharm中启动Django服务器
    Window10安装Django,并创建第一个Django项目
    windows10安装tensorflow CPU版本
    service中显示一个dialog
    xp局域网共享访问没权限处理
    java线程调度
    Java优雅停机
    jit编译原理
    java final思考
  • 原文地址:https://www.cnblogs.com/Henry-ZHAO/p/12725209.html
Copyright © 2020-2023  润新知