设置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+VisualStudio2022+DkamSDK_1.6.83验证
  • DkamSDK的配置方法请参考SDK说明书
  • 本例程在D33XS型相机上验证
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace TriggerMode_CSharp
{internal class Program{static void Main(string[] args){Console.WriteLine("Hello ZhiSENSOR!");//**********************************************查询、连接相机****************************************************int camer_num = 0;int camera_ret = -1;//想要连接的相机IPString tarCameraIP = "192.168.40.91";//发现局域网内的相机camer_num = DkamSDK_CSharp.DiscoverCamera();Console.WriteLine("局域网内共有" + camer_num + "台3D相机");//显示局域网内相机IPfor (int i = 0; i < camer_num; i++){Console.WriteLine("局域网内相机的IP为:" + DkamSDK_CSharp.CameraIP(i));if (String.Compare(DkamSDK_CSharp.CameraIP(i), tarCameraIP) == 0){camera_ret = i;}}Console.WriteLine("连接IP为:" + tarCameraIP + "的相机");//连接相机SWIGTYPE_p_CAMERA_OBJECT camera = DkamSDK_CSharp.CreateCamera(camera_ret);int connect = DkamSDK_CSharp.CameraConnect(camera);//**********************************************查询、连接相机****************************************************if (connect == 0){Console.WriteLine("相机连接成功!");//获取当前红外相机的宽和高SWIGTYPE_p_int width_gray = DkamSDK_CSharp.new_intArray(0);DkamSDK_CSharp.GetCameraWidth(camera, width_gray, 0);int width = DkamSDK_CSharp.intArray_getitem(width_gray, 0);SWIGTYPE_p_int height_gray = DkamSDK_CSharp.new_intArray(0);DkamSDK_CSharp.GetCameraHeight(camera, height_gray, 0);int height = DkamSDK_CSharp.intArray_getitem(height_gray, 0);Console.WriteLine("红外图宽度:" + width + "    红外图高度:" + height);//获取当前RGB相机的宽和高SWIGTYPE_p_int width_rgb = DkamSDK_CSharp.new_intArray(0);DkamSDK_CSharp.GetCameraWidth(camera, width_rgb, 1);int widthRGB = DkamSDK_CSharp.intArray_getitem(width_rgb, 0);SWIGTYPE_p_int height_rgb = DkamSDK_CSharp.new_intArray(0);DkamSDK_CSharp.GetCameraHeight(camera, height_rgb, 1);int heightRGB = DkamSDK_CSharp.intArray_getitem(height_rgb, 0);Console.WriteLine("RGB 图宽度:" + widthRGB + "    RGB 图高度:" + heightRGB);//定义接收红外数据的内存大小PhotoInfoCSharp gray_data = new PhotoInfoCSharp();int graysize = width * height;byte[] gray_pixel = new byte[graysize];//定义接收点云数据的内存大小PhotoInfoCSharp PointCloud_data = new PhotoInfoCSharp();int pointsize = width * height * 6;byte[] point_pixel = new byte[pointsize];//定义接收RGB数据的内存大小PhotoInfoCSharp RGB_data = new PhotoInfoCSharp();int RGBsize = widthRGB * heightRGB * 3;byte[] RGB_pixel = new byte[RGBsize];//**********************************************设置工作模式****************************************************//设置相机红外和点云工作模式,也即点云获取的工作模式: 0 连拍模式  1 触发模式//设置红外/点云触发模式int grayMode = 1;if (grayMode == 1){Console.WriteLine( "设置点云和红外图/点云的工作模式为触发模式。。。" );}else{Console.WriteLine("设置点云和红外图/点云的工作模式为连拍模式。。。");}int triggerMode = DkamSDK_CSharp.SetTriggerMode(camera, grayMode);if (triggerMode == 0){Console.WriteLine("设置点云和红外图为触发模式成功!" );}else{Console.WriteLine("设置点云和红外图为触发模式失败!!!");}//设置相机RGB工作模式: 0 连拍模式  1 触发模式int RGBMode = 1;if (RGBMode == 1){Console.WriteLine("设置RGB图的工作模式为触发模式。。。" );}else{Console.WriteLine("设置RGB图的工作模式为连拍模式。。。" );}int tirggerModergb = DkamSDK_CSharp.SetRGBTriggerMode(camera, RGBMode);if (tirggerModergb == 0){Console.WriteLine("设置RGB图为触发模式成功!" );}else{Console.WriteLine("设置RGB图为触发模式失败!!!" );}//设置触发源,该函数同时设置点云、红外和RGB:0 软触发,1 硬触发int TrigSour = 0;if (TrigSour == 0){Console.WriteLine("设置触发源为软触发。。。");}else{Console.WriteLine("设置触发源为硬触发。。。" );}int tirggersource = DkamSDK_CSharp.SetTriggerSource(camera,TrigSour);if (tirggersource == 0){Console.WriteLine("设置触发源成功!" );}else{Console.WriteLine("设置触发源失败!!!");}//**********************************************打开数据通道****************************************************//开启数据流通道(0:红外 1:点云 2:RGB)//红外int streamgray = DkamSDK_CSharp.StreamOn(camera, 0);if (streamgray == 0){Console.WriteLine("红外图通道打开成功!");}else{Console.WriteLine("红外图通道打开失败!!!     错误码:" + streamgray);}//点云int streampoint = DkamSDK_CSharp.StreamOn(camera, 1);if (streampoint == 0){Console.WriteLine("点云通道打开成功!");}else{Console.WriteLine("点云通道打开失败!!!     错误码:" + streampoint);}int streamRGB = DkamSDK_CSharp.StreamOn(camera, 2);if (streamRGB == 0){Console.WriteLine("RGB 图通道打开成功!");}else{Console.WriteLine("RGB 图通道打开失败!!!     错误码:" + streamRGB);}//开始接受数据int start = DkamSDK_CSharp.AcquisitionStart(camera);if (start == 0){Console.WriteLine("可以开始接收数据!");}else{Console.WriteLine("不能接收数据!!!     错误码:" + start);}//刷新缓冲区DkamSDK_CSharp.FlushBuffer(camera, 0);  //红外DkamSDK_CSharp.FlushBuffer(camera, 1);  //点云DkamSDK_CSharp.FlushBuffer(camera, 2);  //RGB//**********************************************触发相机:软触发***************************************//触发采集点云和红外int triggerCount = DkamSDK_CSharp.SetTriggerCount(camera);if (triggerCount == 0){Console.WriteLine("点云和红外采集触发成功!" );}else{Console.WriteLine("点云和红外采集触发失败!!!" );}//触发采集RGBint triggerCountRGB = DkamSDK_CSharp.SetRGBTriggerCount(camera);if (triggerCountRGB == 0){Console.WriteLine("RGB采集触发成功!" );}else{Console.WriteLine("RGB采集触发失败!!!");}Console.WriteLine("等待数据采集、传输。。。");//**********************************************等待相机上传数据***************************************//获取红外数据int capturegray = DkamSDK_CSharp.TimeoutCaptureCSharp(camera, 0, gray_data, gray_pixel, graysize,10000000);if (capturegray == 0){Console.WriteLine("红外数据接收成功!");}else{Console.WriteLine("红外数据接收失败!!!     错误码:" + capturegray);}//获取点云数据int capturepoint = DkamSDK_CSharp.TimeoutCaptureCSharp(camera, 1, PointCloud_data, point_pixel, pointsize, 10000000);if (capturepoint == 0){Console.WriteLine("点云数据接收成功!");}else{Console.WriteLine("点云数据接收失败!!!     错误码:" + capturepoint);}//获取RGB数据int capturergb = DkamSDK_CSharp.TimeoutCaptureCSharp(camera, 2, RGB_data, RGB_pixel, RGBsize,10000000);if (capturergb == 0){Console.WriteLine("RGB数据接收成功!");}else{Console.WriteLine("RGB数据接收失败!!!     错误码:" + capturergb);}//保存红外数据int savegray = DkamSDK_CSharp.SaveToBMPCSharp(camera, gray_data, gray_pixel, graysize, "gray.bmp");if (savegray == 0){Console.WriteLine("红外数据保存成功!");}else{Console.WriteLine("红外数据保存失败败!!!     错误码:" + savegray);}//保存点云数据int savepoint = DkamSDK_CSharp.SavePointCloudToPcdCSharp(camera, PointCloud_data, point_pixel, pointsize, "pointcloud.pcd");if (savepoint == 0){Console.WriteLine("点云数据保存成功!");}else{Console.WriteLine("点云数据保存失败!!!     错误码:" + savepoint);}//保存RGB数据int saveRGB = DkamSDK_CSharp.SaveToBMPCSharp(camera, RGB_data, RGB_pixel, RGBsize, "rgb.bmp");if (saveRGB == 0){Console.WriteLine("RGB数据保存成功!");}else{Console.WriteLine("RGB数据保存失败!!!     错误码:" + saveRGB);}//**********************************************结束工作***************************************//释放内存Array.Clear(point_pixel, 0, point_pixel.Length);Array.Clear(gray_pixel, 0, gray_pixel.Length);Array.Clear(RGB_pixel, 0, RGB_pixel.Length);//关闭数据流DkamSDK_CSharp.AcquisitionStop(camera);int streamoff = DkamSDK_CSharp.StreamOff(camera, 0);int streamoffpoint = DkamSDK_CSharp.StreamOff(camera, 1);int streamoffRGB = DkamSDK_CSharp.StreamOff(camera, 2);//断开相机连接int disconnect = DkamSDK_CSharp.CameraDisconnect(camera);if (disconnect == 0){Console.WriteLine("成功断开相机!");}else{Console.WriteLine("断开相机失败!!!     错误码:" + disconnect);}//销毁相机参数DkamSDK_CSharp.DestroyCamera(camera);}//connect = 0else{Console.WriteLine("相机连接失败,失败代码:" + connect);}}//main}//program
}//namespace

输出

在这里插入图片描述

后记

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/923705.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/923705.shtml
英文地址,请注明出处:http://en.pswp.cn/news/923705.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PHP 常用函数及用法

文章目录PHP 常用函数及用法一、字符串处理函数1. 字符串基础操作2. 字符串查找与替换3. 字符串分割与连接4. 字符串大小写转换5. 字符串格式化二、数组操作函数1. 数组基础操作2. 数组遍历与查找3. 数组修改与排序4. 数组过滤与合并三、文件操作函数1. 文件读写2. 文件和目录信…

yum命令--obsoletes与--allowerasing两者的区别

在 YUM&#xff08;Yellowdog Updater Modified&#xff09;包管理工具中&#xff0c;–obsoletes 和 --allowerasing 是两个与包升级 / 安装相关的选项&#xff0c;它们的功能和使用场景有明显区别&#xff1a; 1. --obsoletes&#xff08;默认启用&#xff09;作用&#xff1…

Day24_【深度学习(3)—PyTorch使用(1)—张量的创建和类型转换】

一、创建张量1.张量基本创建方式torch.tensor 根据指定数据创建张量 &#xff08;最重要&#xff09;torch.Tensor 根据形状创建张量, 其也可用来创建指定数据的张量torch.IntTensor、torch.FloatTensor、torch.DoubleTensor 创建指定类型的张量1.1 torch.tensor# 方式一&…

阿里云图像编辑大模型开发部署

与阿里云一起轻松实现数智化让算力成为公共服务&#xff1a;用大规模的通用计算&#xff0c;帮助客户做从前不能做的事情&#xff0c;做从前做不到的规模。让数据成为生产资料&#xff1a;用数据的实时在线&#xff0c;帮助客户以数据为中心改变生产生活方式创造新的价值。图像…

查看磁盘分区并新建一个分区,挂载分区

linux系统磁盘df -h查看文件系统的磁盘的空间占用情况&#xff0c;常用于快速检查磁盘使用率&#xff1a;df -h-h是说把磁盘空间以G位单位&#xff0c;如果直接用df也是可以的&#xff0c;只不过单位是块&#xff0c;看的不明显du -sh /home/查看/home目录下总共占用了多大的空…

vscode单击暂时预览文件 双击持续打开文件

直接单击文件列表中的文件&#xff0c;会在编辑器中以预览模式打开 文件标签会显示为斜体&#xff0c;表示是预览状态 当您单击另一个文件或开始编辑时&#xff0c;预览文件会自动关闭 在 settings.json 中添加&#xff0c;mac通过cmd,实现。 json {"workbench.editor.ena…

设计模式-桥接模式04

什么是桥接模式&#xff1f; 桥接模式就是把事物的两个方面&#xff08;两个变化的维度&#xff09;分开管理&#xff0c;让它们可以分别自由变化&#xff0c;然后通过一个“桥”把它们连接起来。举个生活中的例子 想象一下你在买鞋子&#xff1a; 鞋子有不同的款式&#xff08…

群晖企业级NAS :从中小企业效率工具到核心业务数据基石

在数字化转型加速的今天&#xff0c;数据已成为企业最核心的资产。全球超半数财富 500 强企业选择群晖&#xff08;Synology&#xff09;作为数据管理伙伴&#xff0c;其企业级 NAS 解决方案凭借 DSM 操作系统的生态优势、硬件与软件的深度协同&#xff0c;以及覆盖全场景的产品…

C++访问限定符private、public、protected的使用场景

C 访问控制关键字&#xff1a;public、private、protected 在C中&#xff0c;public、private和protected是访问控制关键字&#xff0c;用于实现面向对象编程的封装特性&#xff0c;控制类成员的访问权限。 访问控制关键字的使用场景 1. public&#xff08;公有成员&#xff09…

CKA08--PVC

Task mariadb namespace 中的 MariaDB Deployment 被误删除。请恢复该 Deployment 并确保数据持久性。 请按照以下步骤&#xff1a; 如下规格在 mariadb namespace 中创建名为 mariadb 的 PersistentVolumeClaim (PVC)&#xff1a; 访问模式为 ReadWriteOnce 存储为 250Mi 集群…

Freertos系列(调度机制与创建任务)

如果不想看的可以直接使用git把我的代码下载出来&#xff0c;里面工程挺全的&#xff0c;后期会慢慢的补注释之类的 码云地址&#xff1a;stm32学习笔记: stm32学习笔记源码 如果不会使用git快速下载可以选择直接下载压缩包或者去看看git的使用 Git入门教程-CSDN博客 一 调…

C++中std::vector Vs std::deque VS std::list对比详解

1) 核心差异速览 std::vector&#xff1a;连续内存、随机访问 O(1)、尾部 push_back 摊还 O(1)、中间插入/删除 O(n)&#xff0c;非常缓存友好。std::deque&#xff1a;分段&#xff08;block&#xff09;存储&#xff0c;不是整体连续&#xff1b;随机访问 O(1)&#xff08;但…

【js】js实现日期转大写:

文章目录一、方法&#xff1a;二、使用效果&#xff1a;一、方法&#xff1a; export function dateToChnese(strDate) {let dateMap {year: "",month: "",day: ""}if (!strDate || strDate.length 0) return dateMap;const chineseDigit [&…

逆向 js

参考地址&#xff1a;https://blog.csdn.net/2302_80243887/article/details/146349209 注意事项 1. crypto-js 安装 需要你的.js文件同级目录执行npm install crypto-js 才能让js文件引入包 注意事项2&#xff1a; crypto-js 执行js 报错_external_runtime.py" A…

FFmpeg的安装及简单使用

简介 FFmpeg 是一个跨平台的音视频处理工具库/命令行工具&#xff0c;其核心作用是&#xff1a;对音视频文件或流进行解码、转换&#xff08;编码&#xff09;、封装/解封装等处理。 友情提示 本次安装以Windows64位操作系统为例 一、下载及安装 1、前往FFmpeg官网&#xff0…

Science Advances--3D打印生物启发扭曲双曲超材料,用于无人机冲击缓冲和自供电实时传感

湍流引起的振动会对飞机的结构完整性及飞行稳定性造成巨大威胁&#xff0c;尤其是在无人驾驶飞行器&#xff08;UAV&#xff09;中&#xff0c;实时的冲击监测和轻质防护尤为重要。该研究基于生物启发&#xff0c;通过3D 打印尼龙PA12 制备了一种扭转-双曲面超材料&#xff08;…

AI大模型的研发流程

开发一个大模型是一个庞大、复杂且资源密集的系统工程&#xff0c;涉及算法研究、工程实现、数据管理和算力基础设施等多个层面。下面我将为您提供一个从零开始开发大模型的全景式路线图&#xff0c;涵盖了从概念到部署的全过程。请注意&#xff0c;完全从零开始训练一个类似GP…

Docker desktop安装Redis Cluster集群

本文章将介绍如何在 Windows 系统的 Docker Desktop 环境中搭建 Redis 集群。将创建一个包含 6 个节点&#xff08;3 主 3 从&#xff09;的 Redis 集群。 环境准备 Windows 10/11 操作系统Docker Desktop 已安装并运行 步骤 清理环境&#xff08;如之前有尝试&#xff09; 如果…

Zynq开发实践(SDK之第一个纯PS工程)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】学编程的时候&#xff0c;大家一般都比较重视第一个项目的创建和执行。第一个fpga程序一般是led闪烁&#xff0c;第一个c程序一般就是hello world程…

EJS(Embedded JavaScript)(一个基于JavaScript的模板引擎,用于在HTML中嵌入动态内容)

文章目录**1. 什么是 EJS&#xff1f;****2. 核心特点**- **接近原生 HTML**- **动态渲染**- **轻量高效**- **与 Express 深度集成****3. EJS 的基本语法****4. 示例代码****HTML 模板&#xff08;views/user.ejs&#xff09;****Express 中渲染模板****5. 使用场景**1. **服务…