知微传感Dkam系列3D相机OpenCV应用篇:OpenCV读入3D相机数据

发布时间:2026/7/18 12:03:19

知微传感Dkam系列3D相机OpenCV应用篇:OpenCV读入3D相机数据
OpenCV读入3D相机数据写在前面本人从事机器视觉细分的3D相机行业。编写此系列文章主要目的有1、便利他人应用3D相机本系列文章包含公司所出售相机的SDK的使用例程及详细注释2、促进行业发展及交流。知微传感Dkam系列3D相机可以应用于定位分拣、焊接引导、逆向建模、检测测量等领域欢迎与我深入交流Liu_Gump_OpenCV读取数据说明基本说明知微传感的3D相机可以输出红外图灰度图和RGB图以便利2D3D的应用场景红外图和RGB图在相机端是以char类型存储并在上位机中以char类型接收的深度图是从点云中提取的Z值按照红外图的顺序存放的在提取数据的过程中将char类型转为了short类型相关APIGetCloudPlaneZ 获取Z轴数据int GetCloudPlaneZ(Camera_Object_C* camera_obj, PhotoInfo *raw_data, short *imagedata)函数功能获取点云 Z 平面数据头文件dkam_zhicamera_api.h参数camera_obj相机的结构体指针; raw_data点云数据; imagedata获取的 Z 平面数据返回值0获取成功; 非 0获取失败例程及注释本例程基于WIN10VisualStudio2019DkamSDK_1.6.71OpenCV4.5.4采用C语言DkamSDK的配置方法请参考SDK说明书OpenCV的配置方法另请查阅除自己安装配置OpenCV外还可以利用知微传感提供的DkamSDK自带的OpenCV在include和lib文件夹内本例程在D132S型相机上验证#include iostream //DkamSDK #includedkam_discovery.h #includedkam_gige_camera.h #includedkam_gige_stream.h #includedkam_zhicamera_api.h //OpenCV #include opencv2/opencv.hpp int main() { std::cout Hello ZhiSENSOR! std::endl; std::cout Hello liu_sensor! std::endl; std::vectorDiscoveryInfo discovery_info; Discovery discovery; GigeCamera camera; GigeStream* pointgigestream NULL; GigeStream* graygigestream NULL; GigeStream* rgbgigestream NULL; //**********************************************查询相机**************************************************** //查询局域网内的3D相机 std::vectorDiscoveryInfo().swap(discovery_info); 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 相机红外图的宽为: width std::endl; std::cout 相机红外图的高为: 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 相机RGB图的宽为 width_RGB std::endl; std::cout 相机RGB图的高为 height_RGB std::endl; //定义红外数据大小 PhotoInfo* gray_data new PhotoInfo; gray_data-pixel new char[width * height]; memset(gray_data-pixel, 0, width * height); //定义点云数据大小 PhotoInfo* point_data new PhotoInfo; point_data-pixel new char[width * height * 6]; memset(point_data-pixel, 0, width * height * 6); //定义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:点云 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; } //RGB图通道 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 captureGray -1; captureGray graygigestream-TimeoutCapture(gray_data, 3000000); if (captureGray 0) { std::cout 红外接收成功 std::endl; } else { std::cout 红外接收失败 std::endl; std::cout 失败代号 captureGray 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; } //采集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 失败代号 captureRGB std::endl; } //保存数据到本地 //保存红外数据 int savegray camera.SaveToBMP(*gray_data, (char*)Gray.bmp); if (savegray 0) { std::cout 红外图保存成功 std::endl; } else { std::cout 红外图保存失败 std::endl; } //保存RGB数据 int savergb camera.SaveToBMP(*RGB_data, (char*)RGB.bmp); if (savergb 0) { std::cout RGB图保存成功 std::endl; } else { std::cout RGB图保存失败 std::endl; } //保存深度图 int savedepth camera.SaveDepthToPng(*point_data, (char*)Depth.png); if (savedepth 0) { std::cout 深度图保存成功 std::endl; } else { std::cout 深度图保存失败 std::endl; } //**********************************************将数据OpenCV可处理格式*************************************** //灰度图 std::cout 将红外图转换到OpenCV格式并显示... std::endl; cv::Mat GrayImage cv::Mat(height, width, CV_8UC1, (void*)gray_data-pixel); //显示灰度图 cv::imshow(Gray Picture, GrayImage); //RGB图 std::cout 将RGB图转换到OpenCV格式并显示... std::endl; cv::Mat RGBimage cv::Mat(height_RGB, width_RGB, CV_8UC3, (void*)RGB_data-pixel); //前面有使用API保存RGB到本地的操作这个操作会将RGB数据转为888格式因此直接使用上面这句代码会成功如果没有保存RGB这一步需要先将RGB数据转为RGB888后使用上面的代码才能成功可以使用RawdataToRgb888(*RGB_data)这个函数进行更改 cv::imshow(RGB Picture, RGBimage); //深度图 std::cout 提取深度数据,转换到OpenCV格式并显示... std::endl; short* depthdata (short*)malloc(width * height * 2 * sizeof(short)); memset((void*)depthdata,0, width * height * 2 * sizeof(short)); int getZ camera.GetCloudPlaneZ(*point_data, depthdata); if (getZ 0) { std::cout 提取点云Z值成功 std::endl; } else { std::cout 提取点云Z值失败 std::endl; } cv::Mat DepthImage cv::Mat(height, width, CV_16U, (void*)depthdata); cv::imshow(Depth Picture, DepthImage); std::cout 注意深度图像素值乘以最小单位才是真实物理世界的距离。 std::endl; std::cout 各型号最小单位如下 std::endl; std::cout D132S 0.05mm std::endl; std::cout D300 1/60mm std::endl; std::cout D330XS0.02mm std::endl; std::cout D330S 0.02mm std::endl; std::cout D330M 0.05mm std::endl; std::cout D330L 0.05mm 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; delete depthdata; //关闭数据流通道 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; } else { std::cout 相机连接失败 std::endl; std::cout 请排查原因代号 connect std::endl; } cv::waitKey(0); }运行结果结果对比使用知微传感自带的保存API保存的图片和OpenCV显示结果对比仅示意了红外图可以看出用OpenCV显示的图片和用官方体供的API保存的数据相同以上代码可行后记知微传感Dkam系列3D相机可以应用于定位分拣、焊接引导、逆向建模、检测测量等领域

相关新闻

Huihui-gemma-4-12B-coder-fable5-composer2.5-v1-abliterated-4bit-msq震撼发布:重新定义Apple Silicon上的AI编码体验

Huihui-gemma-4-12B-coder-fable5-composer2.5-v1-abliterated-4bit-msq震撼发布:重新定义Apple Silicon上的AI编码体验

2026/7/18 12:03:19

Huihui-gemma-4-12B-coder-fable5-composer2.5-v1-abliterated-4bit-msq震撼发布:重新定义Apple Silicon上的AI编码体验 【免费下载链接】Huihui-gemma-4-12B-coder-fable5-composer2.5-v1-abliterated-4bit-msq 项目地址: https://ai.gitcode.com/hf_mirrors/ml…

3步解锁微信聊天记录永久保存:开源工具WeChatExporter完全指南

3步解锁微信聊天记录永久保存:开源工具WeChatExporter完全指南

2026/7/18 12:03:19

3步解锁微信聊天记录永久保存:开源工具WeChatExporter完全指南 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 你是否曾因手机更换而丢失珍贵的微信聊天记录&…

ChatGPT写手册≠复制粘贴:从Prompt工程到版本受控的6层质量门禁体系(含审计追踪日志样例)

ChatGPT写手册≠复制粘贴:从Prompt工程到版本受控的6层质量门禁体系(含审计追踪日志样例)

2026/7/18 12:03:19

更多请点击: https://kaifayun.com 第一章:ChatGPT写手册≠复制粘贴:从Prompt工程到版本受控的6层质量门禁体系(含审计追踪日志样例) 生成式AI辅助技术文档编写,绝非将大模型输出直接粘贴发布。真正的工程…

从信息论和FEP视角看游戏设计

从信息论和FEP视角看游戏设计

2026/7/18 13:33:23

我们可以将游戏视为一个信息处理系统,而玩家的心智则是一个预测机器。两者的互动构成了一个动态的“张力场”,而“沉浸感”与“吸引力”正是这个场处于最佳状态时的体验。 第一层:信息论的视角 —— 游戏是“熵”的引擎 从信息论看&#xff0…

React性能优化:避免组件不必要渲染的实践指南

React性能优化:避免组件不必要渲染的实践指南

2026/7/18 13:33:23

1. 问题背景与优化必要性 在React应用开发中,组件的不必要渲染是性能损耗的主要来源之一。当父组件状态更新时,其所有子组件默认都会重新渲染,即使这些子组件的props和state并未发生任何变化。这种"过度渲染"现象在复杂应用中会导致…

【ChatGPT翻译功能深度拆解】:20年本地化工程师亲测的5大隐藏能力与3个致命误用陷阱

【ChatGPT翻译功能深度拆解】:20年本地化工程师亲测的5大隐藏能力与3个致命误用陷阱

2026/7/18 13:33:23

更多请点击: https://kaifayun.com 第一章:ChatGPT翻译功能的底层机制与能力边界 ChatGPT 的翻译能力并非基于专用机器翻译模型(如 Google Translate 的 GNMT 或 Meta 的 NLLB),而是源于其大规模多语言预训练与指令微…

ChatGPT写竞品分析的“黑箱”终于被拆解:基于217份真实交付报告的模式识别,发现TOP 5高价值分析框架(附可导入Notion模板)

ChatGPT写竞品分析的“黑箱”终于被拆解:基于217份真实交付报告的模式识别,发现TOP 5高价值分析框架(附可导入Notion模板)

2026/7/18 13:33:23

更多请点击: https://kaifayun.com 第一章:ChatGPT写竞品分析的“黑箱”本质与认知跃迁 当用户输入“请对比Notion、Obsidian和Logseq在知识管理场景下的核心差异”,ChatGPT会迅速生成结构清晰、术语规范的分析报告。然而,这份输…

技术成长必经之路:从故障排查到系统思维的蜕变

技术成长必经之路:从故障排查到系统思维的蜕变

2026/7/18 13:33:23

那天晚上,我盯着屏幕上的报错信息,已经是第三次从头部署同一个服务。环境变量、依赖冲突、权限问题……每个坑都踩得结结实实。凌晨两点,办公室只剩我一个人,窗外下着大雨。就在某个瞬间,当我终于看到服务正常启动的日…

无人机通信协议详解:从PWM到DShot的技术演进

无人机通信协议详解:从PWM到DShot的技术演进

2026/7/18 13:23:23

1. 无人机通信协议的基础认知在无人机系统中,飞行控制器(Flight Controller,简称飞控)与电子调速器(Electronic Speed Controller,简称ESC)之间的通信质量直接决定了飞行性能的优劣。就像人类神…

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践

2026/7/17 10:50:47

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator XUnity.AutoTranslator作为Unity游戏社区中最成熟的文本翻译解决方…

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持

2026/7/17 17:34:09

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持 【免费下载链接】raspberrypi-kernel It provides openEuler kernel source for Raspberry Pi 项目地址: https://gitcode.com/openeuler/raspberrypi-kernel 前往项目官网免费下载&…

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧

2026/7/18 5:51:23

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧 【免费下载链接】integration-test The repo contains test suits for system integration test 项目地址: https://gitcode.com/openeuler/integration-test 前往项目官网免费下载:…

从模糊意图到可执行指令:Claude PRD中Prompt Engineering与需求颗粒度的5级映射法则

从模糊意图到可执行指令:Claude PRD中Prompt Engineering与需求颗粒度的5级映射法则

2026/7/18 0:02:02

更多请点击: https://kaifayun.com 第一章:从模糊意图到可执行指令:Claude PRD中Prompt Engineering与需求颗粒度的5级映射法则 在Claude驱动的产品需求文档(PRD)生成实践中,原始业务意图往往以自然语言片…

Cursor配置生成失效?3大隐藏陷阱+4行修复代码,资深工程师连夜整理的紧急补救清单

Cursor配置生成失效?3大隐藏陷阱+4行修复代码,资深工程师连夜整理的紧急补救清单

2026/7/18 0:02:02

更多请点击: https://codechina.net 第一章:Cursor配置生成失效?3大隐藏陷阱4行修复代码,资深工程师连夜整理的紧急补救清单 Cursor 配置生成突然失效,是近期高频报障场景。表面看是 cursor.config.json 未更新或 LSP…

某智驾大牛创业

某智驾大牛创业

2026/7/18 0:02:02

作者:钟声编辑:Mark出品:红色星际头图:智能驾驶图片据悉,国内某头部智驾公司端到端模型技术大牛Z投身创业,并且已经拿到融资。Z不仅是该头部公司内部最年轻的对标阿里P10级别技术负责⼈,更是业内…