知微传感Dkam系列3D相机SDK例程篇:Python获取内外参

获取3D相机内外参

写在前面

  • 本人从事机器视觉细分的3D相机行业。编写此系列文章主要目的有:
    • 1、便利他人应用3D相机,本系列文章包含公司所出售相机的SDK的使用例程及详细注释;
    • 2、促进行业发展及交流。

获取相机内外参及API说明

相机内外参说明
  • 知微传感Dkam系列3D相机允许用户获取镜头的畸变参数、内参和外参
  • 畸变参数、内参、外参的定义另请自主查询
相关API
  • GetCamInternelParameter 获取相机内参
    • int GetCamInternelParameter(int camera_cnt, float *Kc, float *K)
    • 函数功能: 获取相机内部参数
    • 参 数: camera_cnt:CMOS 编号(0:红外 1:RGB); Kc:镜头畸变参数(K1,K2,P1,P2,K3)(K1,K2,K3为径向畸变参数,P1,P2为切向畸变参数);K:镜头的内参(fx,0,cx,0,fy,cy,0,0,1)
    • 返回值: 0:设置正常 非 0:设置失败
  • GetCamExternelParameter 获取相机外参
    • int GetCamExternelParameter(int camera_cnt, float *R, float *T)
    • 函数功能: 获取相机外部参数
    • 参 数: camera_cnt:CMOS 编号(0:红外 1:RGB); R:当前镜头相对于红外镜头(点云)坐标系的旋转矩阵;T:当前镜头相对于红外镜头(点云)坐标系的平移向量
    • 返回值: 0:设置正常 非 0:设置失败

例程及注释

  • 本例程基于WIN10+python 3.11.4 + numpy 1.26.4 +DkamSDK_1.6.83验证
  • DkamSDK的配置方法请参考SDK说明书
  • 本例程在D330XS型相机上验证
python 复制代码
from DkamSDK import *
import numpy as np

print('Hello ZhiSENSOR')

class DkamSDK_class:

    # 将分配的数据定义成全局变量,避免内存增长
    def __init__(self):
        self.point      = PhotoInfoCSharp()
        self.gray       = PhotoInfoCSharp()
        self.rgb        = PhotoInfoCSharp()
        self.point_num  = 0
        self.pointpixel = None
        self.gray_num   = 0
        self.graypixel  = None
        self.rgb_num    = 0
        self.rgbpixel   = None
        self.gray_cloud = None
        self.rgb_cloud  = None

    def connectSave(self):
        
        #**********************************************查询、连接相机****************************************************
        camera_num = DiscoverCamera()
        print("局域网内共有",camera_num,"台3D相机")

        #显示局域网内相机的IP
        for i in range(camera_num):
            print("局域网内相机IP为:",CameraIP(i))
            if CameraIP(i) == b'192.168.40.11':
                camera_ret = i
                #print(camera_ret)
                
        #连接相机
        camera = CreateCamera(camera_ret)
        connect = CameraConnect(camera)

        if connect == 0:
            print("相机连接成功!")

            #**********************************************获取内参****************************************************
            #定义存放参数的数组
            kc = new_floatArray(5)  #5个float型
            kk = new_floatArray(9)  #9个float型
            print("获取红外镜头内参中......")
            grayPara = 0 #0代表红外镜头
            getInternelGray = GetCamInternelParameter(camera, grayPara, kc, kk)
            if getInternelGray == 0:
                print("红外镜头内参获取成功!")
                print("红外镜头畸变参数为:")
                print("K1 = %e" %floatArray_getitem(kc,0))
                print("K2 = %e" %floatArray_getitem(kc,1))
                print("P1 = %e" %floatArray_getitem(kc,2))
                print("P2 = %e" %floatArray_getitem(kc,3))
                print("K3 = %e" %floatArray_getitem(kc,4))

                print("红外镜头内参为(按行输出):")
                for n in range(9):
                    print("kk:%e" %floatArray_getitem(kk, n))

            else:
                print("红外镜头内参获取失败!!!。。。错误码",getInternelGray)

            print("获取RGB镜头内参中......")
            RGBPara = 1 #1代表RGB镜头
            getInternelRGB = GetCamInternelParameter(camera, RGBPara, kc, kk)
            if getInternelRGB == 0:
                print("RGB镜头内参获取成功!")
                print("RGB镜头畸变参数为:")
                print("K1 = %e" %floatArray_getitem(kc,0))
                print("K2 = %e" %floatArray_getitem(kc,1))
                print("P1 = %e" %floatArray_getitem(kc,2))
                print("P2 = %e" %floatArray_getitem(kc,3))
                print("K3 = %e" %floatArray_getitem(kc,4))

                print("RGB镜头内参为(按行输出):")
                for n in range(9):
                    print("kk:%e" %floatArray_getitem(kk, n))

            else:
                print("RGB镜头内参获取失败!!!。。。错误码",getInternelRGB)

            #**********************************************获取RGB与红外的外参****************************************************
            #外参
            r = new_floatArray(9)
            t = new_floatArray(3)
            print("获取RGB镜头相对红外镜头的外参:")
            RGBExPara = 1
            getExternel = GetCamExternelParameter(camera, RGBExPara, r, t)
            if getExternel == 0:
                print("RGB镜头相对红外镜头的外参获取成功!")
                print("RGB镜头相对红外镜头的外参为(按行输出):")
                for j in range(0,9):
                    print("R:%e" % floatArray_getitem(r, j))
                for m in range(0,3):
                    print("T:%e" % floatArray_getitem(t, m))
            else:
                print("RGB镜头相对红外镜头的外参获取失败!!!。。。错误码",getExternel)


            #**********************************************结束工作***************************************

            # 断开相机
            disconnect = CameraDisconnect(camera)
            if disconnect == 0:
                print("成功断开相机!")
            else:
                print("断开相机失败!!!     错误码:",disconnect)

            #销毁相机
            DestroyCamera(camera)

        else:
            print("相机连接失败,失败代码:",connect)    
            


if __name__ == '__main__':
    DkamSDK_camera = DkamSDK_class()
    DkamSDK_camera.connectSave()

运行结果

后记

  • 因为外参是以红外(点云)坐标系为参考,因此获取外参时只获取了RGB镜头的外参
相关推荐
触底反弹43 分钟前
面试被问到 Text2SQL,我用 DeepSeek 自己实现了一个
python·sqlite
2601_962295581 小时前
python+selenium实现自动化测试
自动化测试·python·selenium·学习心得·web端测试
青 春 记 忆1 小时前
零基础入门python66:FastAPI AI标题、摘要和标签
python·fastapi·后端开发
qq_22589174661 小时前
基于Python+Django的LangGraph智能旅游规划系统
python·django·旅游
青 春 记 忆1 小时前
零基础入门python65:FastAPI 安全调用大模型API
python·fastapi·后端开发
维克兜率天2 小时前
【维克】特征归一化与标准化:为什么模型对数据的“尺度“很敏感?
人工智能·笔记·python·机器学习·量化
2601_962298672 小时前
Python multiprocessing PicklingError: Can't pickle &l
python·module·multiprocessing·function·picklingerror
CV山月2 小时前
大模型强化学习对齐:从 RLHF 框架到 PPO 算法原理
人工智能·python·大模型·强化学习·多模态·研究生
用户739548002062 小时前
本地 CSV 清洗的小细节:先标准化,再去重,并保留可检查的报告
python
AC赳赳老秦3 小时前
文旅市场公开数据分析:基于 OpenClaw 采集景区客流与门票公示数据,生成区域文旅热度监测报告
java·c语言·python·php·symfony·deepseek·openclaw