知微传感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镜头的外参
相关推荐
Full Stack Developme3 小时前
java.net 包详解
java·python·.net
江太翁4 小时前
Kotlin 与 Java 互操作中常用注解
java·python·kotlin
星期天要睡觉5 小时前
深度学习——基于ResNet18迁移学习的图像分类模型
人工智能·python·分类·迁移学习
小钱c75 小时前
Python使用 pandas操作Excel文件并新增列数据
python·excel·pandas
AI数据皮皮侠5 小时前
中国博物馆数据
大数据·人工智能·python·深度学习·机器学习
格林威6 小时前
UV 紫外相机在半导体制造领域的应用
人工智能·数码相机·opencv·计算机视觉·视觉检测·制造·uv
wu_jing_sheng06 小时前
Python中使用HTTP 206状态码实现大文件下载的完整指南
开发语言·前端·python
程序员大雄学编程6 小时前
「用Python来学微积分」2. 函数图像的变换
python·数学·微积分
xingxing_F6 小时前
Rhino 8 for Mac 犀牛3D建模软件
macos·3d