知微传感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镜头的外参
相关推荐
zone77391 天前
001:简单 RAG 入门
后端·python·面试
F_Quant1 天前
🚀 Python打包踩坑指南:彻底解决 Nuitka --onefile 配置文件丢失与重启报错问题
python·操作系统
允许部分打工人先富起来1 天前
在node项目中执行python脚本
前端·python·node.js
IVEN_1 天前
Python OpenCV: RGB三色识别的最佳工程实践
python·opencv
haosend1 天前
AI时代,传统网络运维人员的转型指南
python·数据网络·网络自动化
曲幽1 天前
不止于JWT:用FastAPI的Depends实现细粒度权限控制
python·fastapi·web·jwt·rbac·permission·depends·abac
IVEN_2 天前
只会Python皮毛?深入理解这几点,轻松进阶全栈开发
python·全栈
Ray Liang2 天前
用六边形架构与整洁架构对比是伪命题?
java·python·c#·架构设计
AI攻城狮2 天前
如何给 AI Agent 做"断舍离":OpenClaw Session 自动清理实践
python
千寻girling2 天前
一份不可多得的 《 Python 》语言教程
人工智能·后端·python