Azure Kinect 获取相机内参

处理 Kinect 相机录制的深度视频时,有时候需要用到相机内参,发现网上不太有相关资源,故总结一下。

录制 mkv 文件中获取

录制得到 mkv 文件中存在附件 calibration.json,存储了相机的内外参数。

点击查看附件具体内容
{
    "CalibrationInformation": {
        "Cameras": [
            {
                "Intrinsics": {
                    "ModelParameterCount": 14,
                    "ModelParameters": [
                        0.49862006306648254,
                        0.49299359321594238,
                        0.49295613169670105,
                        0.49312511086463928,
                        3.8691997528076172,
                        2.0663304328918457,
                        0.086164794862270355,
                        4.2011380195617676,
                        3.3314094543457031,
                        0.50915241241455078,
                        0,
                        0,
                        7.02285033185035E-5,
                        0.00015635808813385665
                    ],
                    "ModelType": "CALIBRATION_LensDistortionModelBrownConrady"
                },
                "Location": "CALIBRATION_CameraLocationD0",
                "Purpose": "CALIBRATION_CameraPurposeDepth",
                "MetricRadius": 1.7399997711181641,
                "Rt": {
                    "Rotation": [
                        1,
                        0,
                        0,
                        0,
                        1,
                        0,
                        0,
                        0,
                        1
                    ],
                    "Translation": [
                        0,
                        0,
                        0
                    ]
                },
                "SensorHeight": 1024,
                "SensorWidth": 1024,
                "Shutter": "CALIBRATION_ShutterTypeUndefined",
                "ThermalAdjustmentParams": {
                    "Params": [
                        0,
                        0,
                        0,
                        0,
                        0,
                        0,
                        0,
                        0,
                        0,
                        0,
                        0,
                        0
                    ]
                }
            },
            {
                "Intrinsics": {
                    "ModelParameterCount": 14,
                    "ModelParameters": [
                        0.50041943788528442,
                        0.51068669557571411,
                        0.476089745759964,
                        0.63471859693527222,
                        0.34417539834976196,
                        -2.8604564666748047,
                        1.8035205602645874,
                        0.21697279810905457,
                        -2.6490097045898437,
                        1.7056518793106079,
                        0,
                        0,
                        -4.4145919673610479E-5,
                        0.00047436624299734831
                    ],
                    "ModelType": "CALIBRATION_LensDistortionModelBrownConrady"
                },
                "Location": "CALIBRATION_CameraLocationPV0",
                "Purpose": "CALIBRATION_CameraPurposePhotoVideo",
                "MetricRadius": 0,
                "Rt": {
                    "Rotation": [
                        0.99997377395629883,
                        0.0072122937999665737,
                        -0.00064296292839571834,
                        -0.007122507318854332,
                        0.99573004245758057,
                        0.092037834227085114,
                        0.0013040214544162154,
                        -0.0920308455824852,
                        0.99575531482696533
                    ],
                    "Translation": [
                        -0.032023865729570389,
                        -0.0021201763302087784,
                        0.0039135357365012169
                    ]
                },
                "SensorHeight": 3072,
                "SensorWidth": 4096,
                "Shutter": "CALIBRATION_ShutterTypeUndefined",
                "ThermalAdjustmentParams": {
                    "Params": [
                        0,
                        0,
                        0,
                        0,
                        0,
                        0,
                        0,
                        0,
                        0,
                        0,
                        0,
                        0
                    ]
                }
            }
        ],
        "InertialSensors": [
            {
                "BiasTemperatureModel": [
                    -0.016476714983582497,
                    0,
                    0,
                    0,
                    0.024192806333303452,
                    0,
                    0,
                    0,
                    0.015445239841938019,
                    0,
                    0,
                    0
                ],
                "BiasUncertainty": [
                    9.9999997473787516E-5,
                    9.9999997473787516E-5,
                    9.9999997473787516E-5
                ],
                "Id": "CALIBRATION_InertialSensorId_LSM6DSM",
                "MixingMatrixTemperatureModel": [
                    0.98985481262207031,
                    0,
                    0,
                    0,
                    -0.0027861578855663538,
                    0,
                    0,
                    0,
                    -0.0029240367002785206,
                    0,
                    0,
                    0,
                    -0.0027407032903283834,
                    0,
                    0,
                    0,
                    1.0062906742095947,
                    0,
                    0,
                    0,
                    -0.0052220304496586323,
                    0,
                    0,
                    0,
                    -0.0029174494557082653,
                    0,
                    0,
                    0,
                    -0.0052966782823204994,
                    0,
                    0,
                    0,
                    0.99210965633392334,
                    0,
                    0,
                    0
                ],
                "ModelTypeMask": 16,
                "Noise": [
                    0.00095000001601874828,
                    0.00095000001601874828,
                    0.00095000001601874828,
                    0,
                    0,
                    0
                ],
                "Rt": {
                    "Rotation": [
                        -0.0037576679605990648,
                        0.11113974452018738,
                        -0.9937976598739624,
                        -0.99998712539672852,
                        -0.0038041053339838982,
                        0.0033556451089680195,
                        -0.0034075656440109015,
                        0.99379748106002808,
                        0.11115261167287827
                    ],
                    "Translation": [
                        0,
                        0,
                        0
                    ]
                },
                "SecondOrderScaling": [
                    0,
                    0,
                    0,
                    0,
                    0,
                    0,
                    0,
                    0,
                    0
                ],
                "SensorType": "CALIBRATION_InertialSensorType_Gyro",
                "TemperatureBounds": [
                    5,
                    60
                ],
                "TemperatureC": 0
            },
            {
                "BiasTemperatureModel": [
                    -0.0095243612304329872,
                    0,
                    0,
                    0,
                    -0.0029438617639243603,
                    0,
                    0,
                    0,
                    -0.11047996580600739,
                    0,
                    0,
                    0
                ],
                "BiasUncertainty": [
                    0.0099999997764825821,
                    0.0099999997764825821,
                    0.0099999997764825821
                ],
                "Id": "CALIBRATION_InertialSensorId_LSM6DSM",
                "MixingMatrixTemperatureModel": [
                    1.0036085844039917,
                    0,
                    0,
                    0,
                    -0.000692621513735503,
                    0,
                    0,
                    0,
                    -0.0016570064472034574,
                    0,
                    0,
                    0,
                    -0.00070016534300521016,
                    0,
                    0,
                    0,
                    0.99279278516769409,
                    0,
                    0,
                    0,
                    0.0003493333060760051,
                    0,
                    0,
                    0,
                    -0.0016633484046906233,
                    0,
                    0,
                    0,
                    0.00034689210588112473,
                    0,
                    0,
                    0,
                    0.99978172779083252,
                    0,
                    0,
                    0
                ],
                "ModelTypeMask": 56,
                "Noise": [
                    0.010700000450015068,
                    0.010700000450015068,
                    0.010700000450015068,
                    0,
                    0,
                    0
                ],
                "Rt": {
                    "Rotation": [
                        -0.0040588844567537308,
                        0.10675475746393204,
                        -0.99427711963653564,
                        -0.99998855590820313,
                        -0.0029550541657954454,
                        0.0037649183068424463,
                        -0.0025362195447087288,
                        0.994280993938446,
                        0.10676553100347519
                    ],
                    "Translation": [
                        -0.050834301859140396,
                        0.00404530530795455,
                        0.00093045207904651761
                    ]
                },
                "SecondOrderScaling": [
                    0,
                    0,
                    0,
                    0,
                    0,
                    0,
                    0,
                    0,
                    0
                ],
                "SensorType": "CALIBRATION_InertialSensorType_Accelerometer",
                "TemperatureBounds": [
                    5,
                    60
                ],
                "TemperatureC": 0
            }
        ],
        "Metadata": {
            "SerialId": "000266714512",
            "FactoryCalDate": "11/2/2021 9:10:55 AM GMT",
            "Version": {
                "Major": 1,
                "Minor": 2
            },
            "DeviceName": "AzureKinect-PV",
            "Notes": "PV0_max_radius_invalid"
        }
    }
}

不过看起来,这里使用的相机模型是 BrownConrady,有 14 个参数,我并不太了解含义……

官方 sdk 获取相机内参

这里 提到官方 SDK 提供了输出 calibration 的接口:Azure-Kinect-Sensor-SDK/examples/calibration/main.cpp at develop · microsoft/Azure-Kinect-Sensor-SDK
具体可看代码,通过 calib.intrinsics.parameters.param 获取。

第三方工具

pykinect 是基于官方 API 封装的 python 模块,也可以实现获取相机内参。假设我们录制得到了 kinect.mkv 视频,从视频中读取各项参数的代码如下:

import pykinect_azure as pykinect

pykinect.initialize_libraries()
playback = pykinect.start_playback(r"data\kinect.mkv")
calibration = playback.get_calibration()

# see: https://github.com/microsoft/Azure-Kinect-Sensor-SDK/blob/develop/examples/calibration/main.cpp#L79-L80
resolution_width = calibration._handle.depth_camera_calibration.resolution_width
resolution_height = calibration._handle.depth_camera_calibration.resolution_height
depth_params = calibration.depth_params
message = (
    "Depth Intrinsic parameters: \n"
    f"\tcx: {depth_params.cx}\n"
    f"\tcy: {depth_params.cy}\n"
    f"\tfx: {depth_params.fx}\n"
    f"\tfy: {depth_params.fy}\n"
    f"\tk1: {depth_params.k1}\n"
    f"\tk2: {depth_params.k2}\n"
    f"\tk3: {depth_params.k3}\n"
    f"\tk4: {depth_params.k4}\n"
    f"\tk5: {depth_params.k5}\n"
    f"\tk6: {depth_params.k6}\n"
    f"\tcodx: {depth_params.codx}\n"
    f"\tcody: {depth_params.cody}\n"
    f"\tp2: {depth_params.p2}\n"
    f"\tp1: {depth_params.p1}\n"
    f"\tmetric_radius: {depth_params.metric_radius}\n"
)
print(message)

也许可以获得更多参数,但是要翻翻官方 API 文档才能知道了。

另外,我发现 open3d 也内置了 kinect 的相机参数:open3d.camera.PinholeCameraIntrinsicParameters - Open3D 0.18.0 documentation,不过看起来只支持了 Kinect2。

posted @ 2024-02-29 14:45  BuckyI  阅读(335)  评论(0编辑  收藏  举报