知微传感Dkam系列3D相机SDK例程篇:Python连接相机及保存点云数据
·
序言
写在前面
- 本人从事机器视觉细分的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图是没有经过畸变校正的,若需要,用户可获取相机各镜头的内参进行校正,获取内、外参的例程可在本专栏的其他文章中获取
更多推荐
所有评论(0)