MVG读书笔记——单应矩阵估计这件小事(三)

本文探讨了坐标变换下单应矩阵的不变性,分析了DLT算法及几何误差在不同坐标系中的表现,并介绍了OpenCV中实现标准化变换的具体步骤。

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

坐标变换下的不变性

实际应用中,不同程序对于坐标原点的规定可能不同,坐标系的尺度也可能不同。于是很自然会有一个问题,在这些情况下我们通过两幅图像的对应点求解出的单应矩阵还是同一个么?即单应矩阵有没有不变性?

用更加正式点语言表述如下:

假设一幅图像中的点x在另外一套坐标系中表示方法为x˜,它的在另一幅图像中的对应点x’在另一套坐标系中表示方法为x˜。其中

x˜i=Txi,x˜i=Txi

考虑x=Hx则有x˜=THT1x˜

于是可以得到H˜=THT1

于是,从新的坐标x˜x˜我们可以得到H˜。进而得到H=T1H˜T

那么问题来了,对于任意的T,T我们是否总能求出同样的H呢?

DLT算法的不变性

考虑一系列对应点集合xixi,使用DLT算法求解出它们的单应矩阵为H。再考虑对x˜x˜,其中x˜i=Txi,x˜i=Txi。令H˜=THT1。上一节的的问题就变成了:

DLT算法是否能从x˜x˜解出上述的H?

如上节一样,定义ϵ˜i=x˜i×H˜x˜i,可以计算出

ϵ˜i=x˜i×H˜x˜i=Txi×(THT1)Txi=Txi×THxi=T(xi×Hxi)=Tϵi

其中T=det(T)TT(存在定理(Mx)×(My)=M(x×y)

对于相似变换T=[sR0Tt1],可以求出T=s[RtTR0s].
T带入ϵi的前两项有。

A˜ih˜=(ϵ˜i1ϵ˜i2)T=sR(ϵi1ϵi2)T=sRAih

R为正交矩阵,所以R不改变向量的范数,于是||A˜h˜||=s||Ah||

用代数误差来表示就是

dalg(x˜i,H˜x˜i)=sdalg(xi,Hxi)

由此,我们发现对于同样的代数误差(相差一个尺度),可以推导出一组对应的H和H˜。可能由此我们会认为最小化代数误差解出的H和H˜满足H˜=THT1。然而事实并非如此。

因为在DLT算法求解时为了使得方程有唯一解我们添加了一项约束||H||=1。于是对于相同的代数误差,在||H||=1和||H˜||=1下解出的两者并不满足前面所说的等式。

事实上,它们不满足简单的对应关系,就是说

minimizeidalg(xi,Hxi)2||H||=1minimizeidalg(x˜i,H˜x˜i)2||H||=1minimizeidalg(x˜i,H˜x˜i)2||H˜||=1

因此我们说坐标的变换会导致不同的解。只有当||Ah||不随坐标变换而变换时我们可以找出H与H˜之间的关系。如何做到这一点,又是另一个问题。接下来我们将探讨几何误差的不变性。

几何误差的不变性

使用最小化几何误差的方法来寻找H,对于相似变换具有不变性。如前面提到的,考虑一系列对应点集合xixi,使用DLT算法求解出它们的单应矩阵为H。再考虑对x˜x˜,其中x˜i=Txi,x˜i=Txi。令H˜=THT1。假设T,T’代表IP2中的欧氏变换。可以验证

d(x˜,H˜x˜)=d(Tx,THT1Tx)=d(Tx,THx)=d(x,Hx)

这是显然的,因为欧式变换不改变长度(距离)。因此它们最小化的是同一个东西,求出来的H也是双射的,即最小化几何误差对于欧式变换具有不变性。

对于相似变换,几何误差之间显然相差一个相似系数。计算出的HH˜可以如欧式变换的情况中一样简单的一一对应起来。所以几何误差具有相似变换不变性。

标准化变换

正如开始所讲,DLT算法得出的单应取决于坐标框架,它对于相似变换不具有不变性。也就是说某个坐标框架中计算出的H要好于另外一个框架中计算出的H。为了减少甚至消除这一点的影响,我们在执行DLT算法之前需要进行标准化。

对一幅图像中所有点进行标准化,使得它们的中心移到坐标原点,同时使得它们与坐标原点的平均距离等于2(这个数值是为了计算的方便)。即所有点在以原点为圆心,r=2的圆两侧。

这样的做法使得各种坐标框架上的点被变换到了同一套坐标系下,再进行DLT算法,就使得它有了相似变换不变性。

由此,我们对DLT算法进行改进:
1)对x进行标准化,变换记作T
2)对x’进行标准化,T’
3)DLT算法
4)反标准化。H=T1H˜T

于是得到了H。

附录:OpenCV里面的求解算法

可以看到,OpenCV使用的单应矩阵的求解算法就是上面所说的方法


int runKernel( InputArray _m1, InputArray _m2, OutputArray _model ) const
{
    Mat m1 = _m1.getMat(), m2 = _m2.getMat();
    int i, count = m1.checkVector(2);
    const Point2f* M = m1.ptr<Point2f>();
    const Point2f* m = m2.ptr<Point2f>();

    double LtL[9][9], W[9][1], V[9][9];
    Mat _LtL( 9, 9, CV_64F, &LtL[0][0] );
    Mat matW( 9, 1, CV_64F, W );
    Mat matV( 9, 9, CV_64F, V );
    Mat _H0( 3, 3, CV_64F, V[8] );
    Mat _Htemp( 3, 3, CV_64F, V[7] );
    Point2d cM(0,0), cm(0,0), sM(0,0), sm(0,0);

    for( i = 0; i < count; i++ )
    {
        cm.x += m[i].x; cm.y += m[i].y;
        cM.x += M[i].x; cM.y += M[i].y;
    }

    cm.x /= count;
    cm.y /= count;
    cM.x /= count;
    cM.y /= count;

    for( i = 0; i < count; i++ )
    {
        sm.x += fabs(m[i].x - cm.x);
        sm.y += fabs(m[i].y - cm.y);
        sM.x += fabs(M[i].x - cM.x);
        sM.y += fabs(M[i].y - cM.y);
    }

    if( fabs(sm.x) < DBL_EPSILON || fabs(sm.y) < DBL_EPSILON ||
        fabs(sM.x) < DBL_EPSILON || fabs(sM.y) < DBL_EPSILON )
        return 0;
    sm.x = count/sm.x; sm.y = count/sm.y;
    sM.x = count/sM.x; sM.y = count/sM.y;

    double invHnorm[9] = { 1./sm.x, 0, cm.x, 0, 1./sm.y, cm.y, 0, 0, 1 };
    double Hnorm2[9] = { sM.x, 0, -cM.x*sM.x, 0, sM.y, -cM.y*sM.y, 0, 0, 1 };
    Mat _invHnorm( 3, 3, CV_64FC1, invHnorm );
    Mat _Hnorm2( 3, 3, CV_64FC1, Hnorm2 );

    _LtL.setTo(Scalar::all(0));
    for( i = 0; i < count; i++ )
    {
        double x = (m[i].x - cm.x)*sm.x, y = (m[i].y - cm.y)*sm.y;
        double X = (M[i].x - cM.x)*sM.x, Y = (M[i].y - cM.y)*sM.y;
        double Lx[] = { X, Y, 1, 0, 0, 0, -x*X, -x*Y, -x };
        double Ly[] = { 0, 0, 0, X, Y, 1, -y*X, -y*Y, -y };
        int j, k;
        for( j = 0; j < 9; j++ )
            for( k = j; k < 9; k++ )
                LtL[j][k] += Lx[j]*Lx[k] + Ly[j]*Ly[k];
    }
    completeSymm( _LtL );

    eigen( _LtL, matW, matV );
    _Htemp = _invHnorm*_H0;
    _H0 = _Htemp*_Hnorm2;
    _H0.convertTo(_model, _H0.type(), 1./_H0.at<double>(2,2) );

    return 1;
}
<think>嗯,用户想找多视图几何(MVG)相关的数据集下载。首先,我需要回忆一下常见的多视图几何数据集有哪些。多视图几何通常用于维重建、立体视觉、SLAM等领域,所以相关的数据集应该包含多个视角的图像、相机参数、深度信息或者点云数据。 首先想到的是Middlebury数据集,他们提供了多视图立体匹配的标准数据集,比如2006和2014年的版本,里面应该有多视角图像和真实深度图。然后还有ETH3D,这个也是用于维重建和立体匹配的高分辨率数据集,适合多视图几何算法测试。 接下来,Euroc MAV数据集,主要用于无人机和SLAM,但里面也有双目相机和IMU数据,可能对多视图几何有用。DTU Robot Dataset应该也不错,特别是用于多视图立体重建,有精确的相机参数和结构化光照扫描的真实数据。 还有TUM的RGB-D SLAM数据集,虽然主要是RGB-D数据,但也适用于多视图研究。KITTI自动驾驶数据集里的立体视觉和视觉里程计部分也可能相关。BlendedMVS和ScanNet这两个大型数据集,前者是合成数据适合训练,后者是真实室内场景的RGB-D数据。 然后,用户可能还需要知道这些数据集的具体内容和下载方式,比如Middlebury和ETH3D的官网,KITTI需要注册,BlendedMVC在GitHub上。要提醒用户注意数据集的许可协议和使用限制,特别是商业用途可能需要授权。 另外,用户提供的引用中有提到多视图几何中的深度融合、视图稳定性以及物方点与视图的关联,所以推荐的数据集应该包含多视图、深度信息和3D点云,比如Middlebury、DTU和BlendedMVC这些会更符合需。需要确认每个数据集是否包含相机参数、标定信息,这对多视图几何算法至关重要。 最后,生成相关问题时要考虑用户可能进一步的需,比如如何处理这些数据集、算法实现、评估指标等。要确保回答结构清晰,分点列出数据集,每个数据集的信息和下载链接,以及注意事项,这样用户能方便地找到所需资源。</think>### 多视图几何(MVG)常用数据集及下载方式 多视图几何研究依赖于包含多视角图像、相机参数及维真值的数据集。以下是经典和最新的公开数据集推荐: --- #### 1. **Middlebury Multi-View Stereo Dataset** - **内容**: 包含高精度多视角图像、相机标定参数、真实深度图和维模型,适用于立体匹配与重建算法验证。 - **下载**: [Middlebury官网](https://vision.middlebury.edu/mview/) - **特点**: 提供不同光照和纹理场景,如“Temple”“Dino”等[^2]。 --- #### 2. **ETH3D Dataset** - **内容**: 高分辨率多视图图像、激光扫描点云和相机参数,支持多视图立体匹配和SLAM研究。 - **下载**: [ETH3D官网](https://www.eth3d.net/) - **特点**: 包含室内外场景,提供训练集和测试集[^1]。 --- #### 3. **DTU Robot Image Dataset** - **内容**: 超过100个场景的多视图图像,精确的相机姿态和结构化光照扫描的3D真值。 - **下载**: [DTU数据集页面](http://roboimagedata.compute.dtu.dk/) - **特点**: 适用于大规模维重建算法评估[^3]。 --- #### 4. **KITTI Vision Benchmark Suite** - **内容**: 自动驾驶场景的双目图像、激光雷达点云和相机标定参数,支持多视图几何与SLAM。 - **下载**: [KITTI官网](http://www.cvlibs.net/datasets/kitti/)(需注册) - **特点**: 真实道路场景,包含动态物体干扰。 --- #### 5. **BlendedMVS Dataset** - **内容**: 大规模合成多视图数据集,覆盖多种物体和场景,包含深度图和3D模型。 - **下载**: [GitHub链接](https://github.com/YoYo000/BlendedMVS) - **特点**: 适合深度学习模型训练[^4]。 --- #### 6. **ScanNet Dataset** - **内容**: 真实室内场景的RGB-D视频序列,提供相机轨迹、3D网格和语义标注。 - **下载**: [ScanNet官网](https://www.scan-net.org/) - **特点**: 支持多模态研究(几何+语义)。 --- #### 注意事项 - **数据协议**: 部分数据集(如KITTI)需遵守非商业或学术使用协议。 - **预处理**: 下载后需检查相机参数对齐性(如焦距、畸变系数)[^1]。 ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值