HoloLens2 初入——从Lut表中求解相机内参

HoloLens2 初入——从Lut表中求解相机内参

引言

求取定位相机内参矩阵的目的是为了能够将相机坐标系下的坐标点映射到图像上的像素点。这个过程在进行深度相机和其它相机对齐的时候需要用到。
对齐的意思就是在灰度图像中找到和深度图像某一个像素点对于的像素位置。
(2021/7/6更新)这边内参的目标相机指的是4个定位的灰度相机,目前深度相机(存在畸变,后续会有)和中间的彩色相机并不适用(变焦相机,不属于研究者模式下的传感器,可直接调用函数得到内参) 。
由于最近时间比较紧,先不写详细的内容。先把关键的代码开源一下。 以后再详细解释

HoloLens2 的相机们

——待补充

基本条件

1、相应相机的lut表
2、该相机的分辨率
这两个条件可以通过微软提供的SteamRecorder工程得到。工程链接
类似下图的文件,我这边是包括了所有相机的,自己需要用哪个从工程中拿到哪个就可以

在这里插入图片描述

关键代码

因为我的代码都是中英混编的,所以先不详细注释了
因为是中英混编的,所以记得到在你们的代码最前面(导入包之前添加下面语句)

# -*- 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图像

贴一张效果图
在这里插入图片描述

Guess you like

Origin blog.csdn.net/scy261983626/article/details/117224024