点击上方“计算机视觉工坊”,选择“星标”
干货第一时间送达
提到三角化大家都十分熟悉,在CV 领域中,由像点计算物点的过程称为三角化,但在摄影测量领域,其称作为前方交会。值得注意的是单张影像是无法恢复像点的三维坐标,至少需要两张影像才能得到像素点的真实坐标(这里已知两张影像的pose信息)
三角化有很多方法,这里介绍两帧三角化、多帧三角化、迭代三角化、选权迭代多帧三角化(并附上本人代码)。
1、两帧三角化
在opencv 中函数triangulatePoints就可根据两帧的pose 和内参恢复三维点坐标,cv中的三角化是两帧且是没有权的。
其函数参数如下:
void cv::triangulatePoints ( InputArray projMatr1, //P1 1 3*4
InputArray projMatr2, //P2 3*4
InputArray projPoints1, //pixel coordinates
InputArray projPoints2, // pixel coordinates
OutputArray points4D // 3D coordinates
)
2、多帧三角化
三角化严密解推导过程:
由共线条件方程得到三角化严密解法,将分母移到左边,得到
整理可得:
l1X+l3Y+l3Z−lx=0L4X+l5Y+l6Z−ly=0
其中:
从上可以知道,一个像点可以列2个方程,对于n个同名像点就可以列2n个方程(AX=B,超定方程按照最小二乘求解),即是多帧三角化,代码如下:
def pixelToCam(pts,K):
'''
:param pts: pixel coordinates
:param K: camera params
:return: camera coordinates
'''
camPts=np.zeros((1,2))
camPts[0,0]=(pts[0,0]-K[0,2])/K[0,0]
camPts[0,1]=(pts[0,1]-K[1,2])/K[1,1