OpenCV3 外极线的绘制

两张视角相似的图片,通过提取特征点、描述子,然后进行匹配,再通过单应约束优化之后得到的匹配关系基本就是正确的匹配了。然后在此基础上想画出外极线,来验证一下匹配的结果是否正确。于是就写了一个简单的函数。假设已经得到了匹配的特征点了,下面的函数将会画出这些点对应的外极线。


[cpp]  view plain  copy
  1. //画出外极线,对应点已经经过了RANSAC优化  
  2. void DrawEpiLines(const Mat& img_1, const Mat& img_2, vector<Point2f>points1, vector<Point2f>points2){  
  3.   
  4.     cv::Mat F = cv::findFundamentalMat(points1, points2, CV_FM_8POINT);  
  5.         //首先根据对应点计算出两视图的基础矩阵,基础矩阵包含了两个相机的外参数关系  
  6.   
  7.        std::vector<cv::Vec<float, 3>> epilines1, epilines2;  
  8.     cv::computeCorrespondEpilines(points1, 1, F, epilines1);//计算对应点的外极线epilines是一个三元组(a,b,c),表示点在另一视图中对应的外极线ax+by+c=0;  
  9.         cv::computeCorrespondEpilines(points2, 2, F, epilines2);  
  10.     //将图片转换为RGB图,画图的时候外极线用彩色绘制  
  11.     cv::Mat img1, img2;  
  12.     if (img_1.type() == CV_8UC3)  
  13.     {  
  14.          img_1.copyTo(img1);  
  15.          img_2.copyTo(img2);  
  16.      }  
  17.      else if (img_1.type() == CV_8UC1)  
  18.      {  
  19.          cvtColor(img_1, img1, COLOR_GRAY2BGR);  
  20.          cvtColor(img_2, img2, COLOR_GRAY2BGR);  
  21.      }  
  22.      else  
  23.      {  
  24.          cout << "unknow img type\n" << endl;  
  25.          exit(0);  
  26.      }  
  27.   
  28.      cv::RNG& rng = theRNG();  
  29.      for (uint i = 0; i < points2.size(); i++)  
  30.     {  
  31.         Scalar color = Scalar(rng(256), rng(256), rng(256));//随机产生颜色  
  32.   
  33.         circle(img2, points2[i], 5, color);//在视图2中把关键点用圆圈画出来,然后再绘制在对应点处的外极线  
  34.         line(img2, Point(0, -epilines1[i][2] / epilines1[i][1]), Point(img2.cols, -(epilines1[i][2] + epilines1[i][0] * img2.cols) / epilines1[i][1]), color);  
  35.                 //绘制外极线的时候,选择两个点,一个是x=0处的点,一个是x为图片宽度处  
  36.          circle(img1, points1[i], 4, color);  
  37.          line(img1, cv::Point(0, -epilines2[i][2] / epilines2[i][1]), cv::Point(img1.cols, -(epilines2[i][2] + epilines2[i][0] * img1.cols) / epilines2[i][1]), color);  
  38.           
  39.     }  
  40.     cv::imshow("img2 epiline1", img2);  
  41.     cv::imshow("img1 epiline2", img1);  
  42.   
  43.     waitKey(0);  
  44. }  



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值