序言 写在前面 编写此系列文章主要目的有: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图是没有经过畸变校正的,若需要,用户可获取相机各镜头的内参进行校正,获取内、外参的例程可在本专栏的其他文章中获取