当前位置: 首页 > news >正文

知微传感Dkam系列3D相机SDK例程篇:Python设置相机触发模式

设置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型相机上验证
from DkamSDK import *
import numpy as npprint('Hello ZhiSENSOR')class DkamSDK_class:# 将分配的数据定义成全局变量,避免内存增长def __init__(self):self.point      = PhotoInfoCSharp()self.gray       = PhotoInfoCSharp()self.rgb        = PhotoInfoCSharp()self.point_num  = 0self.pointpixel = Noneself.gray_num   = 0self.graypixel  = Noneself.rgb_num    = 0self.rgbpixel   = Noneself.gray_cloud = Noneself.rgb_cloud  = Nonedef connectSave(self):#**********************************************查询、连接相机****************************************************camera_num = DiscoverCamera()print("局域网内共有",camera_num,"台3D相机")#显示局域网内相机的IPfor 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 * heightself.graypixel = bytes(self.gray_num)#定义存放点云大小self.point_num = width * height * 6self.pointpixel = bytes(self.point_num)#定义存放RGB大小self.rgb_num = width_RGB * height_RGB * 3self.rgbpixel = bytes(self.rgb_num)#**********************************************设置工作模式****************************************************# 设置相机红外和点云工作模式,也即点云获取的工作模式: 0 连拍模式  1 触发模式#设置红外/点云触发模式grayMode = 1if grayMode == 1:print("设置点云和红外图/点云的工作模式为触发模式。。。")else:print("设置点云和红外图/点云的工作模式为连拍模式。。。")triggerMode = SetTriggerMode(camera, grayMode);if triggerMode == 0:print("设置点云和红外图为触发模式成功!")else:print("设置点云和红外图为触发模式失败!!!     错误码:",triggerMode)#设置相机RGB工作模式: 0 连拍模式  1 触发模式RGBMode = 1if RGBMode == 1:print("设置RGB图的工作模式为触发模式。。。")else:print("设置RGB图的工作模式为连拍模式。。。")tirggerModergb = SetRGBTriggerMode(camera, RGBMode);if triggerMode == 0:print("设置RGB图为触发模式成功!")else:print("设置RGB图为触发模式失败!!!     错误码:",tirggerModergb)#设置触发源,该函数同时设置点云、红外和RGB:0 软触发,1 硬触发TrigSour = 0if 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)#触发采集RGBtriggerCountRGB = 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相机并不会告知上位机当前工作状态
  • 如需配置曝光等参数,须在触发采集数据之前
http://www.dtcms.com/a/482954.html

相关文章:

  • Java 故障分析与性能调优命令详解(含案例)
  • 【Pytorch】激活函数 Loss 梯度 超详细文本笔记
  • 不同材质金冠钳的力学性能及其对修复体就位影响研究
  • vs2015做网站的后端个人怎么做百度竞价
  • 微信小程序入门学习教程,从入门到精通,项目实战:美妆商城小程序 —— 知识点详解与案例代码 (18)
  • 微信小程序添加水印功能
  • 02_ES索引规范kibana
  • 购物网站建设模板图片价格低的跑车
  • LeetCode hot100:049 字母异位词分组:两种解法的深度解析
  • 网站建设业务前景政务信息网站建设制度
  • 使用C#写微信小程序后端——电商微信小程序
  • C++——vector容器、动态容器
  • C++ 类与对象(下篇)笔记整理
  • 重庆建站服务商漳浦网站开发
  • 深入浅出理解电感:从理论到实践的电路“惯性”元件
  • 分布式事务:基于MQ事务的解决方案详解
  • 无信息先验:贝叶斯分析中的客观基准
  • 公司官网备案流程mysql优化 wordpress
  • 网站建设员课程注册网页版
  • 瑞莎星瑞(Radxa Orion O6) 基于 Android OS 使用 NPU的图片模糊查找APP 开发
  • 户外商品网站制作长沙网站建设的公司
  • 安卓13_ROM修改定制化-----ROM解打包 修改 讲解 导读篇
  • 网站设计亮点望野亭
  • RTC时钟原理
  • STM32运行原理深度解析:从软件到硬件的神奇之旅
  • OpenCV(十一):色彩空间转换
  • 广州安全教育平台网宁波网站seo哪家好
  • 家装网站自己做的平面设计常用网站
  • Three.js轨道控制器完全指南(OrbitControls与TrackballControls)
  • 服务器数据恢复—硬盘黄灯预警,RAID5阵列数据如何恢复?