设置3D相机触发模式
写在前面
- 本人从事机器视觉细分的3D相机行业。编写此系列文章主要目的有:
- 1、便利他人应用3D相机,本系列文章包含公司所出售相机的SDK的使用例程及详细注释;
- 2、促进行业发展及交流。
设置触发模式及API说明
触发模式说明
- 知微传感Dkam系列3D相机拥有连续模式和触发模式两种工作模式
- 连续模式是3D相机主动采集数据并不断上传输出
- 触发模式是3D相机在收到触发信号后才会采集数据并更新输出
- 知微传感Dkam系列3D相机具备软触发功能
- 知微传感Dkam系列3D相机除D2xx和D300外均具备硬触发功能
- 软触发即发送数据采集命令后采集一次数据,硬触发即有外部电触发信号后采集一次数据
- 硬触发的电气连线方式、电气要求和电气逻辑请参考3D相机说明书
设置流程
扫描局域网内的相机 连接相机 配置相机工作模式为触发模式 设置触发源 触发相机 等待相机上传数据 结束
API
- SetTriggerMode 设置点云和红外的工作模式
- int SetTriggerMode(Camera_Object_C* camera_obj,int mode)
- 函数功能: 设置点云、红外触发模式
- 参 数: camera_obj:相机的结构体指针 ;mode:模式选择(0 连续 1 触发)
- 返回值: 0:设置成功 非 0:设置失败
- SetRGBTriggerMode 设置RGB的工作模式
- int SetRGBTriggerMode(Camera_Object_C* camera_obj,int mode)
- 函数功能: 设置 RGB 触发模式
- 参 数: camera_obj:相机的结构体指针 ;mode:模式选择(0 连续 1 触发)
- 返回值: 0:设置成功 非 0:设置失败
- SetTriggerSource 触发源
- int SetTriggerSource(Camera_Object_C* camera_obj, int sourcetype)
- 函数功能:设置相机软/硬触发
- 参数:camera_obj:相机的结构体指针 ;sourcetype:相机触发类型(0:软触发 1:硬触发)
- 返回值:0:设置成功 小于 0:设置失败
- 注:该API同时设置红外、点云和RGB的触发源
- SetTriggerCount 触发红外和点云
- int SetTriggerCount()
- 函数功能: 触发相机采集点云和红外数据
- 参 数: 无
- 返回值: 0:设置成功 非 0:设置失败
- SetRGBTriggerCount 触发RGB
- int SetRGBTriggerCount()
- 函数功能: 触发相机采集RGB数据
- 参 数: 无
- 返回值: 0:设置成功 非 0:设置失败
例程及注释
- 本例程基于WIN10+python 3.11.4 + numpy 1.26.4 +DkamSDK_1.6.83验证
- DkamSDK的配置方法请参考SDK说明书
- 本例程在D33XS型相机上验证
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.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)
#**********************************************设置工作模式****************************************************
# 设置相机红外和点云工作模式,也即点云获取的工作模式: 0 连拍模式 1 触发模式
#设置红外/点云触发模式
grayMode = 1
if grayMode == 1:
print("设置点云和红外图/点云的工作模式为触发模式。。。")
else:
print("设置点云和红外图/点云的工作模式为连拍模式。。。")
triggerMode = SetTriggerMode(camera, grayMode);
if triggerMode == 0:
print("设置点云和红外图为触发模式成功!")
else:
print("设置点云和红外图为触发模式失败!!! 错误码:",triggerMode)
#设置相机RGB工作模式: 0 连拍模式 1 触发模式
RGBMode = 1
if RGBMode == 1:
print("设置RGB图的工作模式为触发模式。。。")
else:
print("设置RGB图的工作模式为连拍模式。。。")
tirggerModergb = SetRGBTriggerMode(camera, RGBMode);
if triggerMode == 0:
print("设置RGB图为触发模式成功!")
else:
print("设置RGB图为触发模式失败!!! 错误码:",tirggerModergb)
#设置触发源,该函数同时设置点云、红外和RGB:0 软触发,1 硬触发
TrigSour = 0
if TrigSour == 0:
print("设置触发源为软触发。。。")
else:
print("设置触发源为硬触发。。。")
tirggersource = SetTriggerSource(camera,TrigSour);
if tirggersource == 0:
print("设置触发源成功!")
else:
print("设置触发源失败!!! 错误码:",tirggersource)
#**********************************************打开数据通道****************************************************
#开启数据流通道(0:红外 1:点云 2:RGB)
#打开红外通道
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)
#***********************************触发相机:软触发**********************
#触发采集点云和红外
triggerCount = SetTriggerCount(camera)
if triggerCount == 0:
print("点云和红外采集触发成功!")
else:
print("点云和红外采集触发失败!!! 错误码:",triggerCount)
#触发采集RGB
triggerCountRGB = SetRGBTriggerCount(camera)
if triggerCountRGB == 0:
print("RGB采集触发成功!")
else:
print("RGB采集触发失败!!! 错误码:",triggerCountRGB)
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()
运行结果

后记
- 触发模式下3D相机为主动工作,触发后上位机等待相机拍摄完成并上传,期间3D相机并不会告知上位机当前工作状态
- 如需配置曝光等参数,须在触发采集数据之前