news 2026/7/18 9:53:05

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
知微传感Dkam系列3D相机SDK例程篇:设置相机工作模式

设置3D相机触发模式

写在前面

  • 本人从事机器视觉细分的3D相机行业。编写此系列文章主要目的有:
    • 1、便利他人应用3D相机,本系列文章包含公司所出售相机的SDK的使用例程及详细注释;
    • 2、促进行业发展及交流。
  • 欢迎与我深入交流:Liu_Gump_

设置触发模式及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+VisualStudio2019+DkamSDK_1.6.71,采用C++语言
  • DkamSDK的配置方法请参考SDK说明书
  • 本例程在D132S型相机上验证
#include <iostream> #include <cstring> //DkamSDK #include"dkam_discovery.h" #include"dkam_gige_camera.h" #include"dkam_gige_stream.h" int main() { std::cout << "Hello ZhiSENSOR!\n"; std::vector<DiscoveryInfo> discovery_info; Discovery discovery; GigeCamera camera; GigeStream* pointgigestream = NULL; GigeStream* graygigestream = NULL; GigeStream* rgbgigestream = NULL; std::vector<DiscoveryInfo>().swap(discovery_info); //**********************************************查询相机**************************************************** //查询局域网内的3D相机 int camer_num = discovery.DiscoverCamera(&discovery_info); std::cout << "局域网内共有" << camer_num << "台相机" << std::endl; //显示局域网内相机的IP for (int i = 0; i < camer_num; i++) { std::cout << "局域网内相机的IP为:" << discovery.ConvertIpIntToString(discovery_info[i].camera_ip) << std::endl; } //**********************************************连接相机**************************************************** //选定相机 int k = -1; for (int i = 0; i < camer_num; i++) { if (strcmp((discovery.ConvertIpIntToString(discovery_info[i].camera_ip)), "192.168.30.35") == 0) { k = i; std::cout << "将连接第" << k+1 << "台相机" << std::endl; } else { std::cout << "局域网内无该IP的相机" << std::endl; } } //连接相机 int connect = camera.CameraConnect(&discovery_info[k]); if (connect == 0) { std::cout << "成功连接相机" << std::endl; } else { std::cout << "连接相机失败,请检查!!!" << std::endl; } //**********************************************配置相机**************************************************** if (connect == 0) { //获取当前红外相机的宽和高 int width = -1; int height = -1; std::cout << "获取相机红外图的宽和高。。。" << std::endl; int height_gray = camera.GetCameraHeight(&height, 0); int width_gray = camera.GetCameraWidth(&width, 0); std::cout << "camera Grey width:" << width << "---Grey height:" << height << std::endl; //获取当前RGB相机的宽和高,如相机不支持则无此项 int width_RGB = -1; int height_RGB = -1; std::cout << "获取相机RGB图的宽和高。。。" << std::endl; int height_rgb = camera.GetCameraHeight(&height_RGB, 1); int width_rgb = camera.GetCameraWidth(&width_RGB, 1); std::cout << "camera RGB width:" << width_RGB << "-----RGB height:" << height_RGB << std::endl; //定义点云数据大小 PhotoInfo* point_data = new PhotoInfo; point_data->pixel = new char[width * height * 6]; memset(point_data->pixel, 0, width * height * 6); //定义红外数据大小 PhotoInfo* gray_data = new PhotoInfo; gray_data->pixel = new char[width * height]; memset(gray_data->pixel, 0, width * height); //定义RGB数据大小 PhotoInfo* RGB_data = new PhotoInfo; RGB_data->pixel = new char[width_RGB * height_RGB * 3]; memset(RGB_data->pixel, 0, width_RGB * height_RGB * 3); //设置相机红外和点云工作模式,也即点云获取的工作模式: 0 连拍模式 1 触发模式 int GrayMode = 1; if (GrayMode == 1) { std::cout << "设置点云和红外图的工作模式为触发模式。。。" << std::endl; } else { std::cout << "设置点云和红外图的工作模式为连拍模式。。。" << std::endl; } int tirggerMode = camera.SetTriggerMode(GrayMode); if (tirggerMode == 0) { std::cout << "设置点云和红外图为触发模式成功!" << std::endl; } else { std::cout << "设置点云和红外图为触发模式失败!!!" << std::endl; } //设置相机RGB工作模式: 0 连拍模式 1 触发模式 int RGBMode = 1; if (RGBMode == 1) { std::cout << "设置RGB图的工作模式为触发模式。。。" << std::endl; } else { std::cout << "设置RGB图的工作模式为连拍模式。。。" << std::endl; } int tirggerModergb = camera.SetRGBTriggerMode(1); if (tirggerModergb == 0) { std::cout << "设置RGB图为触发模式成功!" << std::endl; } else { std::cout << "设置RGB图为触发模式失败!!!" << std::endl; } //设置触发源,该函数同时设置点云、红外和RGB:0 软触发,1 硬触发 int TrigSour = 0; if (TrigSour == 0) { std::cout << "设置触发源为软触发。。。" << std::endl; } else { std::cout << "设置触发源为硬触发。。。" << std::endl; } int tirggersource = camera.SetTriggerSource(TrigSour); if (tirggersource == 0) { std::cout << "设置触发源成功!" << std::endl; } else { std::cout << "设置触发源失败!!!" << std::endl; } //**********************************************打开数据通道**************************************************** //开启数据流通道(0:红外 1:点云 2:RGB) int stream_gray = camera.StreamOn(0, &graygigestream); if (stream_gray == 0) { std::cout << "红外图通道打开成功!" << std::endl; } else { std::cout << "红外图通道打开失败!!!" << std::endl; } int stream_point = camera.StreamOn(1, &pointgigestream); if (stream_point == 0) { std::cout << "点云通道打开成功!" << std::endl; } else { std::cout << "点云通道打开失败!!!" << std::endl; } int stream_RGB = camera.StreamOn(2, &rgbgigestream); if (stream_RGB == 0) { std::cout << "RGB图通道打开成功!" << std::endl; } else { std::cout << "RGB图通道打开失败!!!" << std::endl; } //开始接受数据 int acquistion = camera.AcquisitionStart(); if (acquistion == 0) { std::cout << "可以开始接受数据!" << std::endl; } //刷新缓冲区数据 pointgigestream->FlushBuffer(); graygigestream->FlushBuffer(); rgbgigestream->FlushBuffer(); //**********************************************触发相机:软触发*************************************** //触发采集点云和红外 int triggerCount = camera.SetTriggerCount(); if (triggerCount == 0) { std::cout << "点云和红外采集触发成功!" << std::endl; } else { std::cout << "点云和红外采集触发失败!!!" << std::endl; } //触发采集RGB int triggerCountRGB = camera.SetRGBTriggerCount(); if (triggerCountRGB == 0) { std::cout << "RGB采集触发成功!" << std::endl; } else { std::cout << "RGB采集触发失败!!!" << std::endl; } std::cout << "等待数据采集、传输。。。" << std::endl; //**********************************************等待相机上传数据*************************************** //采集点云 int capturePoint = -1; capturePoint = pointgigestream->TimeoutCapture(point_data, 3000000); if (capturePoint == 0) { std::cout << "点云接收成功!" << std::endl; } else { std::cout << "点云接收失败!!!" << std::endl; std::cout << "失败代号:"<< capturePoint << std::endl; } //采集红外 int captureGray = -1; captureGray = graygigestream->TimeoutCapture(gray_data, 3000000); if (captureGray == 0) { std::cout << "红外接收成功!" << std::endl; } else { std::cout << "红外接收失败!!!" << std::endl; std::cout << "失败代号:" << capturePoint << std::endl; } //采集RGB int captureRGB = -1; captureRGB = rgbgigestream->TimeoutCapture(RGB_data, 3000000); if (captureRGB == 0) { std::cout << "RGB接收成功!" << std::endl; } else { std::cout << "RGB接收失败!!!" << std::endl; std::cout << "失败代号:" << capturePoint << std::endl; } //**********************************************保存数据到本地*************************************** //保存点云(pcd) int savepoint = camera.SavePointCloudToPcd(*point_data, (char*)"1.pcd"); if (savepoint == 0) { std::cout << "点云保存成功!" << std::endl; } else { std::cout << "点云保存失败!!!" << std::endl; } //保存红外数据 int savegray = camera.SaveToBMP(*gray_data, (char*)"1.bmp"); if (savegray == 0) { std::cout << "红外图保存成功!" << std::endl; } else { std::cout << "红外图保存失败!!!" << std::endl; } //保存RGB数据 int savergb = camera.SaveToBMP(*RGB_data, (char*)"1_rgb.bmp"); if (savergb == 0) { std::cout << "RGB图保存成功!" << std::endl; } else { std::cout << "RGB图保存失败!!!" << std::endl; } //保存深度图 int savedepth = camera.SaveDepthToPng(*point_data, (char*)"1.png"); if (savedepth == 0) { std::cout << "深度图保存成功!" << std::endl; } else { std::cout << "深度图保存失败!!!" << std::endl; } //**********************************************结束工作*************************************** memset(point_data->pixel, 0, width * height * 6); memset(gray_data->pixel, 0, width * height); memset(RGB_data->pixel, 0, width_RGB * height_RGB * 3); //释放内存 delete[] point_data->pixel; delete point_data; delete[] gray_data->pixel; delete gray_data; delete[] RGB_data->pixel; delete RGB_data; //关闭数据流通道 int streamoff_gray = camera.StreamOff(0, graygigestream); int streamoff_point = camera.StreamOff(1, pointgigestream); int streamoff_rgb = camera.StreamOff(2, rgbgigestream); //断开相机连接 int disconnect = camera.CameraDisconnect(); std::cout << "工作结束!!!!!!" << std::endl; } return 0; }

输出

后记

  • 触发模式下3D相机为主动工作,触发后上位机等待相机拍摄完成并上传,期间3D相机并不会告知上位机当前工作状态
  • 如需配置曝光等参数,须在触发采集数据之前
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/18 9:52:21

SceneSwitcher终极指南:彻底解决OBS直播自动化难题

SceneSwitcher终极指南&#xff1a;彻底解决OBS直播自动化难题 【免费下载链接】SceneSwitcher An automation tool for OBS Studio 项目地址: https://gitcode.com/gh_mirrors/sc/SceneSwitcher SceneSwitcher是OBS Studio的自动化场景切换插件&#xff0c;它能帮你实现…

作者头像 李华
网站建设 2026/7/18 9:52:09

VisioStencils:终极Visio图形库,让IT架构图设计变得简单

VisioStencils&#xff1a;终极Visio图形库&#xff0c;让IT架构图设计变得简单 【免费下载链接】visioStencils 4,486 visio :art: shapes, stencils, symbols, and icons collection to visually represent your IT infrastructure 项目地址: https://gitcode.com/gh_mirro…

作者头像 李华
网站建设 2026/7/18 9:50:25

如何使用Warp11/Warp进行分布式S3性能测试:多客户端协调实战指南

如何使用Warp11/Warp进行分布式S3性能测试&#xff1a;多客户端协调实战指南 【免费下载链接】warp S3 benchmarking tool 项目地址: https://gitcode.com/gh_mirrors/warp11/warp Warp11/Warp是一款强大的S3基准测试工具&#xff0c;能够帮助用户评估对象存储系统的性能…

作者头像 李华
网站建设 2026/7/18 9:49:49

TIDE社区生态:如何参与贡献和获取最新技术支持的完整指南

TIDE社区生态&#xff1a;如何参与贡献和获取最新技术支持的完整指南 【免费下载链接】tide A General Toolbox for Identifying Object Detection Errors 项目地址: https://gitcode.com/gh_mirrors/tide1/tide TIDE&#xff08;A General Toolbox for Identifying Obj…

作者头像 李华
网站建设 2026/7/18 9:48:59

机器人路径规划:自动驾驶运动规划算法深度解析

机器人路径规划&#xff1a;自动驾驶运动规划算法深度解析 【免费下载链接】chhRobotics_CPP 自动驾驶规划控制常用算法c代码实现 项目地址: https://gitcode.com/GitHub_Trending/ch/chhRobotics_CPP 在自动驾驶和机器人导航领域&#xff0c;机器人路径规划是实现智能移…

作者头像 李华
网站建设 2026/7/18 9:48:31

Eflatun.SceneReference高级特性:构建索引与地址获取的实用技巧

Eflatun.SceneReference高级特性&#xff1a;构建索引与地址获取的实用技巧 【免费下载链接】Eflatun.SceneReference Unity Scene References for Runtime and Editor. Strongly typed, robust, and reliable. Provides GUID, Path, Build Index, Name, and Address. 项目地…

作者头像 李华