序言写在前面编写此系列文章主要目的有1、便利他人应用相机本系列文章包含公司所出售相机的SDK的使用例程及详细注释2、促进行业发展及交流。DKAM系列3D相机SDK例程及注释相机连接、数据采集及保存本例程基于WIN10VisualStudio2019DkamSDK_1.6.72,采用C语言SDK的配置方法请参考官方提供的SDK说明书#include iostream //DkamSDK #includedkam_discovery.h #includedkam_gige_camera.h #includedkam_gige_stream.h int main() { std::cout Hello Zhisensor! std::endl; std::cout Hello liu_zhisensro! std::endl; std::vectorDiscoveryInfo discovery_info; Discovery discovery; GigeCamera camera; GigeStream* pointgigestream NULL; GigeStream* graygigestream NULL; GigeStream* rgbgigestream NULL; std::vectorDiscoveryInfo().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图是没有经过畸变校正的若需要用户可获取相机各镜头的内参进行校正获取内、外参的例程可在本专栏的其他文章中获取