两张视角相似的图片,通过提取特征点、描述子,然后进行匹配,再通过单应约束优化之后得到的匹配关系基本就是正确的匹配了。然后在此基础上想画出外极线,来验证一下匹配的结果是否正确。于是就写了一个简单的函数。假设已经得到了匹配的特征点了,下面的函数将会画出这些点对应的外极线。
//画出外极线,对应点已经经过了RANSAC优化
void DrawEpiLines(const Mat& img_1, const Mat& img_2, vector<Point2f>points1, vector<Point2f>points2){
cv::Mat F = cv::findFundamentalMat(points1, points2, CV_FM_8POINT);
//首先根据对应点计算出两视图的基础矩阵,基础矩阵包含了两个相机的外参数关系
std::vector<cv::Vec<float, 3>> epilines1, epilines2;
cv::computeCorrespondEpilines(points1, 1, F, epilines1);//计算对应点的外极线epilines是一个三元组(a,b,c),表示点在另一视图中对应的外极线ax+by+c=0;
cv::computeCorrespondEpilines(points2, 2, F, epilines2);
//将图片转换为RGB图,画图的时候外极线用彩色绘制
cv::Mat img1, img2;
if (img_1.type() == CV_8UC3)
{
img_1.copyTo(img1);
img_2.copyTo(img2);
}
else if (img_1.type() == CV_8UC1)
{
cvtColor(img_1, img1, COLOR