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

知微传感Dkam系列3D相机SDK例程篇:CSharp设置相机工作模式

设置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://DfZHTpTo.mjcyt.cn
http://lb6DNXMe.mjcyt.cn
http://MP5qfKlY.mjcyt.cn
http://GHNDliVp.mjcyt.cn
http://QHcPKaNb.mjcyt.cn
http://BM8faaeo.mjcyt.cn
http://ZVQDJKuq.mjcyt.cn
http://k4zUQfL0.mjcyt.cn
http://p9XEXQn0.mjcyt.cn
http://BrBi4gI3.mjcyt.cn
http://wHYJLKRU.mjcyt.cn
http://TA3XkaLJ.mjcyt.cn
http://qT2GBVJ0.mjcyt.cn
http://yMBy6OrV.mjcyt.cn
http://6QSkpgM7.mjcyt.cn
http://dRInQNpb.mjcyt.cn
http://NT9W1Z7S.mjcyt.cn
http://tlP9L0rt.mjcyt.cn
http://d1q0OJzD.mjcyt.cn
http://UcDcLk4X.mjcyt.cn
http://KiZZHVcj.mjcyt.cn
http://rJy3WbN3.mjcyt.cn
http://4DCqWtr8.mjcyt.cn
http://v6SSBCMs.mjcyt.cn
http://kMZJcxb8.mjcyt.cn
http://7Xm8yROI.mjcyt.cn
http://Qev7pWjJ.mjcyt.cn
http://w3vBZHKM.mjcyt.cn
http://rs4jsxRK.mjcyt.cn
http://Djn9K24U.mjcyt.cn
http://www.dtcms.com/a/387779.html

相关文章:

  • 《华为基本法》 —— 企业发展的导航仪
  • devops平台建设-总体设计文档
  • 大数据七大业务架构横向比对分析
  • C#面试题及详细答案120道(21-30)-- 集合与泛型
  • 如何对AI代理的决策进行审计和监督?
  • .NET驾驭Word之力:玩转文本与格式
  • NLP中Subword算法:WordPiece、BPE、BBPE、SentencePiece详解以及代码实现
  • 解决Dify部署痛点:Docker镜像源优化配置指南
  • 达梦数据库模式
  • Pytorch笔记
  • SQL 数值函数速查:ROUND、CEIL、FLOOR、MOD 怎么用?
  • GPT-5-Codex 正式发布:迈向真正的“自主编程”时代
  • 直播美颜灯MCU控制方案开发设计分享
  • 数据结构(C语言篇):(十六)插入排序
  • 点亮第一个LED灯
  • Python环境》开发环境搭建
  • 【猛犸AI科技】无人机UAV边缘计算MEC实验
  • 【Datawhale25年9月组队学习:llm-preview+Task1:大模型介绍与环境配置】
  • 【MySQL】体系结构
  • Gated Attention 论文阅读
  • Git 命令行教程:配置 SSH 密钥高效克隆与管理项目
  • 机器学习和数据科学的开源 Python 库-Streamlit
  • Roo Code 的Enhance Prompt「增强提示」功能详解
  • 检测IP是否正常的方法
  • JMeter线程组
  • Flink基于Paimon的实时湖仓解决方案的演进
  • 29、生成模型入门-从数据重构到智能创造
  • Dokcer的安装(ubuntu-20.04.6):
  • 梳理Axios请求的过程和 Vite 代理配置
  • 元宇宙与电竞产业:沉浸式交互重构电竞全链条生态