知微传感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镜头的外参
相关推荐
MarcoPage16 分钟前
Python 字典推导式入门:一行构建键值对映射
java·linux·python
TG:@yunlaoda360 云老大2 小时前
腾讯WAIC发布“1+3+N”AI全景图:混元3D世界模型开源,具身智能平台Tairos亮相
人工智能·3d·开源·腾讯云
心 爱心 爱2 小时前
Shape-Guided Dual-Memory Learning for 3D Anomaly Detection 论文精读
计算机视觉·3d·异常检测·工业异常检测·三维异常检测·多模态工业异常检测·二维异常检测
ζั͡山 ั͡有扶苏 ั͡✾6 小时前
从零搭建 Data-Juicer:一站式大模型数据预处理与可视化平台完整教程
python·data-juicer
SkylerHu6 小时前
tornado+gunicorn部署设置max_body_size
python·tornado·gunicorn
独行soc7 小时前
2025年渗透测试面试题总结-234(题目+回答)
网络·python·安全·web安全·渗透测试·1024程序员节·安全狮
木头左7 小时前
年化波动率匹配原则在ETF网格区间选择中的应用
python
清空mega7 小时前
从零开始搭建 flask 博客实验(3)
后端·python·flask
程序员小远8 小时前
7个常见的Jmeter压测问题
自动化测试·软件测试·python·测试工具·测试用例·压力测试·性能测试
gaosushexiangji8 小时前
一项基于高灵敏度sCMOS相机的光镊成像实验
数码相机