序言

写在前面

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

DKAM系列3D相机SDK例程及注释

相机连接、数据采集及保存

  • 本例程基于WIN10+python 3.11.4 + numpy 1.26.4 +DkamSDK_1.6.83
  • SDK的配置方法,请参考官方提供的SDK说明书
  • 本例在D330XS运行
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.91':
                camera_ret = i
                #print(camera_ret)
                
        #连接相机
        camera = CreateCamera(camera_ret)
        connect = CameraConnect(camera)

        if connect == 0:
            print("相机连接成功!")
            #获取当前相机红外图的宽和高
            width_gray  = new_intArray(0)
            height_gray = new_intArray(0)
            getwidth = GetCameraWidth(camera, width_gray, 0)
            getheight = GetCameraHeight(camera, height_gray, 0)
            width = intArray_getitem(width_gray, 0)
            height = intArray_getitem(height_gray, 0)
            print("红外图宽度:%d, 红外图高度:%d" % (width,height))

            #获取当前相机RGB图的宽和高
            width_rgb  = new_intArray(0)
            height_rgb = new_intArray(0)
            getrgbwidth = GetCameraWidth(camera, width_rgb, 1)
            getrgbheight = GetCameraHeight(camera, height_rgb, 1)
            width_RGB = intArray_getitem(width_rgb, 0)
            height_RGB = intArray_getitem(height_rgb, 0)
            print("RGB图宽度:%d, RGB高度:%d" % (width_RGB,height_RGB))

            #定义存放红外数据大小
            self.gray_num = width * height
            self.graypixel = bytes(self.gray_num)
            #定义存放点云大小
            self.point_num = width * height * 6
            self.pointpixel = bytes(self.point_num)
            #定义存放RGB大小
            self.rgb_num = width_RGB * height_RGB * 3
            self.rgbpixel = bytes(self.rgb_num)
            #**********************************************打开数据通道****************************************************
            #打开红外通道
            stream_gray = StreamOn(camera, 0)
            if stream_gray == 0:
                print("红外图通道打开成功!")
            else:
                print("红外图通道打开失败!!!     错误码:",stream_gray)
            #打开点云通道
            stream_point = StreamOn(camera, 1)
            if stream_point == 0:
                print("点云通道打开成功!")
            else:
                print("点云通道打开失败!!!     错误码:",stream_point)
            #打开RGB通道
            stream_RGB = StreamOn(camera, 2)
            if stream_RGB == 0:
                print("RGB图通道打开成功!")
            else:
                print("RGB图通道打开失败!!!     错误码:",stream_RGB)
            
            #开始接收数据
            acquistion = AcquisitionStart(camera)
            if acquistion == 0:
                print("可以开始接收数据!")
            else:
                print("不能接收数据!!!     错误码:",acquistion)

            #刷新缓冲区
            FlushBuffer(camera, 0)
            FlushBuffer(camera, 1)
            FlushBuffer(camera, 2)

            print("等待数据采集、传输。。。")

            #**********************************************等待数据上传****************************************************
            #获取红外数据
            capturegray = TimeoutCaptureCSharp(camera, 0, self.gray, self.graypixel, self.gray_num, 10000000)
            if capturegray == 0:
                print("红外数据接收成功!")
            else:
                print("红外数据接收失败!!!     错误码:",capturegray)
            #获取点云数据
            capturePoint = TimeoutCaptureCSharp(camera, 1, self.point, self.pointpixel, self.point_num, 10000000)
            if capturePoint == 0:
                print("点云数据接收成功!")
            else:
                print("点云数据接收失败!!!     错误码:",capturePoint)
            #获取RGB数据
            captureRGB = TimeoutCaptureCSharp(camera, 2, self.rgb, self.rgbpixel, self.rgb_num, 10000000)
            if captureRGB == 0:
                print("RGB数据接收成功!")
            else:
                print("RGB数据接收失败!!!     错误码:",captureRGB)
            #保存红外数据
            gray_name = b"1.bmp"
            savebmp = SaveToBMPCSharp(camera, self.gray, self.graypixel, self.gray_num, gray_name)
            if savebmp == 0:
                print("红外数据保存成功!")
            else:
                print("红外数据保存失败!!!     错误码:",savebmp)
            #保存点云数据
            pcd_name = b"1.pcd"
            savepcd = SavePointCloudToPcdCSharp(camera, self.point, self.pointpixel, self.point_num, pcd_name)
            if savepcd == 0:
                print("点云数据保存成功!")
            else:
                print("点云数据保存失败!!!     错误码:",savepcd)
            #保存RGB数据
            rgb_name = b"1_rgb.bmp"
            savergb = SaveToBMPCSharp(camera, self.rgb, self.rgbpixel, self.rgb_num, rgb_name)
            if savergb == 0:
                print("RGB数据保存成功!")
            else:
                print("RGB数据保存失败!!!     错误码:",savergb)

            #**********************************************结束工作***************************************
            #关闭数据流
            acquistionstop = AcquisitionStop(camera)
            streamoff_gray = StreamOff(camera, 0)
            streamoff_point = StreamOff(camera, 1)
            streamoff_rgb = StreamOff(camera, 2)

            # 断开相机
            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()


运行结果如下:
在这里插入图片描述

小结

  • 使用SDK或DkamView直接保存的灰度图(红外图)和RGB图是没有经过畸变校正的,若需要,用户可获取相机各镜头的内参进行校正,获取内、外参的例程可在本专栏的其他文章中获取
Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐