【opencv】示例-epipolar_lines.cpp 对极线

这篇文章介绍了如何使用OpenCV库通过SIFT算法检测关键点、计算描述符,然后利用FLANN进行匹配,计算基础矩阵,找出内点,并绘制对极线,以处理和展示两个图像之间的对应关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ee649ab3b854f79541811b3bd3514dcb.png

5fea5e2d6bebe83ddead508beac6bdb9.png

3052f8e425ecb29f4ab2a3d106085c28.png

这段代码总的功能是使用OpenCV库进行立体视觉的估计。它从命令行读取两个图像文件名,使用SIFT算法检测关键点并计算这些点的描述子,接着通过FLANN库进行快速近似最近邻搜索来找到匹配的关键点。然后使用RANSAC方法计算基础矩阵,找到内点,并绘制出对极线和对应的点。最后将处理后的图像显示出来,并且保存到文件。这个程序是处理和展示两个图像之间的对应关系和极线(epilines)的。

// 这个文件属于OpenCV项目的一部分。
// 它服从发现在顶级目录的LICENSE文件中的许可条款
// 以及在http://opencv.org/license.html 网址中的条款。


#include "opencv2/calib3d.hpp" // 包含用于相机标定和三维重建的函数和类
#include "opencv2/highgui.hpp"  // 包含GUI功能,如显示和保存图像,处理鼠标事件等。
#include "opencv2/imgproc.hpp"  // 包含图像处理的功能如滤波,几何变换等。


#include <vector> // 包含标准模板库的vector容器
#include <iostream> // 包含标准输入输出库


using namespace cv; // 使用OpenCV命名空间中的所有成员


// 主函数,程序的入口点
int main(int argc, char** argv) {
    std::string img_name1, img_name2; // 声明两个string变量,用来存放两幅图像的名字
    if (argc < 3) { // 如果命令行参数少于3个(包括程序本身的名称)
       CV_Error(Error::StsBadArg, // 抛出一个错误
                "Path to two images \nFor example: " // 并显示错误信息
                "./epipolar_lines img1.jpg img2.jpg");
    } else {
       img_name1 = argv[1]; // 把第一个图像的文件名赋给img_name1
       img_name2 = argv[2]; // 把第二个图像的文件名赋给img_name2
    }


    Mat image1 = imread(img_name1); // 读取第一幅图像
    Mat image2 = imread(img_name2); // 读取第二幅图像
    Mat descriptors1, descriptors2; // 定义两个Mat对象,用来存放两组特征描述
    std::vector<KeyPoint> keypoints1, keypoints2; // 定义两个 KeyPoint 类型的向量,用来存储两组关键点


    Ptr<SIFT> detector = SIFT::create(); // 创建SIFT检测器
    detecto
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值