文章目录
HoloLens2 初入——从Lut表中求解相机内参
引言
求取定位相机内参矩阵的目的是为了能够将相机坐标系下的坐标点映射到图像上的像素点。这个过程在进行深度相机和其它相机对齐的时候需要用到。
对齐的意思就是在灰度图像中找到和深度图像某一个像素点对于的像素位置。
(2021/7/6更新)这边内参的目标相机指的是4个定位的灰度相机,目前深度相机(存在畸变,后续会有)和中间的彩色相机并不适用(变焦相机,不属于研究者模式下的传感器,可直接调用函数得到内参) 。
由于最近时间比较紧,先不写详细的内容。先把关键的代码开源一下。 以后再详细解释
HoloLens2 的相机们
HoloLens2中有8个相机传感器。分别是4个高速灰度相机、1个变焦前景RGB相机、1个深度相机(红外相机)、以及2个眼动追踪所用的红外相机(尚未确认)。目前,我可以拿到数据的是前6个相机。
————待续
基本条件
1、相应相机的lut表
2、该相机的分辨率
这两个条件可以通过微软提供的SteamRecorder工程得到。工程链接
工程部署看另外一篇文章离线记录传感器数据
记得修改如下图的代码。表示记录这些类型的传感器的数据。会自动把相应的lut标和外参离线保存下来。
类似下图的文件,我这边是包括了所有相机的,自己需要用哪个从工程中拿到哪个就可以
解畸变
哇擦擦擦擦!!!,终于整出来了。
原图
解畸变后的图
----------------------------------------------------------------------------------------------------
以下的方法是错误的,灰度图像中也有畸变, 新的方法正在研究
关键代码
因为我的代码都是中英混编的,所以先不详细注释了
因为是中英混编的,所以记得到在你们的代码最前面(导入包之前添加下面语句)
# -*- coding:utf-8 -*-
def Read读取传感器标定标文件(filepath):
with open(filepath, mode='rb') as depth_file:
lut = np.frombuffer(depth_file.read(), dtype="f")
lut = np.reshape(lut, (-1, 3))
return lut
def Fit_拟合相机内参(lup_标定表, h_图像高, w_图像宽):
"""
u = fx*xc+x0
v = fy*yc+y0
这边要拟合就是fy,fx,x0,y0
返回一个转换矩阵,为相机空间到图像平面的转换矩阵
"""
where = np.where(lup_标定表[:, 2] != 0)
lup_标定表 = lup_标定表[where]
xc = lup_标定表[:, 0] / lup_标定表[:, 2]
yc = lup_标定表[:, 1] / lup_标定表[:, 2]
u = np.arange(0.5, w_图像宽, 1, float)
u = np.tile(u, h_图像高)
u = u[where]
v = np.arange(0.5, h_图像高, 1, float)
v = v.repeat(w_图像宽)
v = v[where]
fx, x0 = Fit_线性拟合(x_自变量集=xc, y_因变量集=u)
fy, y0 = Fit_线性拟合(x_自变量集=yc, y_因变量集=v)
trans_相机To图像 = np.array([[fx, 0, x0], [0, fy, y0], [0, 0, 1]])
return trans_相机To图像
贴一张效果图