news 2026/7/18 12:03:43

知微传感Dkam系列3D相机SDK例程篇:连接相机采集并保存数据

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
知微传感Dkam系列3D相机SDK例程篇:连接相机采集并保存数据

序言

写在前面

  • 编写此系列文章主要目的有:
    • 1、便利他人应用相机,本系列文章包含公司所出售相机的SDK的使用例程及详细注释;
    • 2、促进行业发展及交流。

DKAM系列3D相机SDK例程及注释

相机连接、数据采集及保存

  • 本例程基于WIN10+VisualStudio2019+DkamSDK_1.6.72,采用C++语言
  • SDK的配置方法,请参考官方提供的SDK说明书
#include <iostream> //DkamSDK #include"dkam_discovery.h" #include"dkam_gige_camera.h" #include"dkam_gige_stream.h" int main() { std::cout << "Hello Zhisensor!" << std::endl; std::cout << "Hello liu_zhisensro!" << std::endl; 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)), "169.254.47.60") == 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:点云 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(); std::cout << "等待数据采集、传输。。。" << std::endl; //**********************************************等待相机上传数据*************************************** //采集点云 int capturePoint = -1; capturePoint = pointgigestream->TimeoutCapture(point_data, 6000000); 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*)"PointCloud.pcd"); if (savepoint == 0) { std::cout << "点云保存成功!" << std::endl; } else { std::cout << "点云保存失败!!!" << 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; } //**********************************************结束工作*************************************** 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; }

使用D200采集人脸点云效果

小结

  • 使用SDK或DkamView直接保存的灰度图(红外图)和RGB图是没有经过畸变校正的,若需要,用户可获取相机各镜头的内参进行校正,获取内、外参的例程可在本专栏的其他文章中获取
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/18 12:02:52

如何快速使用ExusData触觉手套数据集:面向AI研究者的完整入门指南

如何快速使用ExusData触觉手套数据集&#xff1a;面向AI研究者的完整入门指南 ExusData是psibot-ai项目下的触觉手套数据集&#xff0c;专为AI研究者打造&#xff0c;提供了丰富的触觉交互数据&#xff0c;助力相关领域的算法开发与研究。 一、ExusData数据集概览 ExusData数据…

作者头像 李华
网站建设 2026/7/18 12:01:45

5分钟搭建免费开源游戏串流服务器:Sunshine终极指南

5分钟搭建免费开源游戏串流服务器&#xff1a;Sunshine终极指南 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine 你是否曾梦想过在客厅的沙发上用大电视玩电脑游戏&#xff1f;或者…

作者头像 李华
网站建设 2026/7/18 12:00:53

Sunshine游戏串流服务器:打造家庭云游戏的终极指南

Sunshine游戏串流服务器&#xff1a;打造家庭云游戏的终极指南 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine Sunshine是一款功能强大的自托管游戏串流服务器&#xff0c;专为Moo…

作者头像 李华
网站建设 2026/7/18 12:00:33

cann/asc-devkit RTC运行时编译

RTC 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言&#xff0c;原生支持C和C标准规范&#xff0c;主要由类库和语言扩展层构成&#xff0c;提供多层级API&#xff0c;满足多维场景算子开发诉求。 项目地址: https://gitcode.com/cann/a…

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

告别重复劳动:用Agent S3让AI帮你操作电脑

告别重复劳动&#xff1a;用Agent S3让AI帮你操作电脑 【免费下载链接】Agent-S Agent S: an open agentic framework that uses computers like a human 项目地址: https://gitcode.com/GitHub_Trending/ag/Agent-S 还在为每天重复的电脑操作感到疲惫吗&#xff1f;&am…

作者头像 李华