【OpenCV】reprojectImageTo3D函数

reprojectImageTo3D函数

该函数将视差图,通过投影矩阵Q,得到一副映射图,图像大小与视差图相同,且每个像素具有三个通道,分别存储了该像素位置在相机坐标系下的三维点坐标在x, y, z,三个轴上的值,即每个像素的在相机坐标系下的三维坐标。

void cv::reprojectImageTo3D( 
	InputArray disparity, 	//视差图像
	OutputArray _3dImage,	//映射后存储三维坐标的图像
	InputArray Q,			//重投影矩阵 通过stereoRectify得到
	bool handleMissingValues = false, //计算得到的非正常值是否给值,如果为true则给值10000
	int ddepth = -1			//输出类型 -1 即默认为CV_32FC3 还可以是 CV_16S, CV_32S, CV_32F
)

运算如下:
[ X , Y , Z , W ] T = Q ∗ [ x , y , d i s p a r i t y ( x , y ) , 1 ] T [X, Y, Z, W]^T=Q*[x, y, disparity(x, y), 1]^T [X,Y,Z,W]T=Q[x,y,disparity(x,y),1]T
_ 3 d I m a g e ( x , y ) = ( X / W , Y / W , Z / W ) \_3dImage(x, y)=(X/W, Y/W, Z/W) _3dImage(x,y)=(X/W,Y/W,Z/W)

其中:
Q = [ 1 0 0 − c x 0 1 0 − c y 0 0 0 f 0 0 − 1 T x c x − c x ′ T x ] , Q [ x y d 1 ] = [ x − c x y − c y f − d + c x − c x ′ T x ] = [ X Y Z W ] Q= \left[ \begin{matrix} 1 & 0 &0& -c_x \\ 0 & 1 & 0 &-c_y\\ 0 & 0 & 0 &f\\ 0 & 0 & \frac{-1}{T_x} &\frac{c_x-c_x^\prime}{T_x} \end{matrix} \right], Q \begin{bmatrix} x\\ y \\ d \\ 1 \end{bmatrix} = \begin{bmatrix} x-c_x\\ y-c_y \\ f\\ \frac{-d+c_x-c_x^\prime}{T_x} \end{bmatrix} = \begin{bmatrix} X\\ Y \\ Z\\ W \end{bmatrix} Q=10000100000Tx1cxcyfTxcxcx,Qxyd1=xcxycyfTxd+cxcx=XYZW
Z W = T x f − [ d − ( c x − c x ′ ) ] \frac{Z}{W}=\frac{T_xf}{-[d-(c_x-c_x^\prime)]} WZ=[d(cxcx)]Txf

c x c_x cx c y c_y cy为左相机主点在图像中的坐标, f f f为焦距, T x T_x Tx为两台相机投影中心间的平移(负值), c x ′ c_x^\prime cx是右相机主点在图像中的坐标。

这里有个地方需要注意,如果获得视差图像是CV_16S类型的,这样的视差图的每个像素值由一个16bit表示,其中低位的4位存储的是视差值得小数部分,所以真实视差值应该是该值除以16。在进行映射后应该乘以16,以获得毫米级真实位置。

评论 130
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

魏Gordon

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值