同时连接多台3D相机并串联触发
写在前面
- 本人从事机器视觉细分的3D相机行业。编写此系列文章主要目的有:
- 1、便利他人应用3D相机,本系列文章包含公司所出售相机的SDK的使用例程及详细注释;
- 2、促进行业发展及交流。
- 知微传感Dkam系列3D相机可以应用于定位分拣、焊接焊缝提取、逆向建模、检测测量等领域
- 欢迎与我深入交流:微信号:liu_zhisensor
-
同时连接多台相机及API说明
同时连接多台相机说明
- 当知微传感的3D相机有多台在同一局域网内时,允许同时被同一台主机连接
- 当不同相机的成像视野有重叠时,不能同时采集数据,因为主动光源会相互干扰
- 3D相机输出点云分为三步:采集数据,计算点云和输出点云
- 知微传感提供了同时连接多台相机并串联触发的例程,所谓串联触发,即第一台相机数据采集完后,不用等待点云计算完成,即可触发第二台相机采集数据,这样当第一台相机计算点云时,第二台相机可以采集数据,这样可以缩短相机之间采集数据的时间差,对节拍有益
- 相机具备软触发和硬触发功能,当全部为软触发时,需要逐个触发;当全部为硬触发时,相机受外部信号控制;当只有一个硬触发信号需要触发全部相机时,可以选择触发第一台相机,其余相机采用软触发方式;
- 相机在硬触发时,会有一个寄存器的值被置1,因此判断这个相机是否被硬触发,需要读取该寄存器的值的变化,该寄存器的值由0变为1再变为0,即证明该相机接收到了一次硬触发
- 本例示意三台相机的数据采集,三台相机间有视野重叠,因此采用串联触发
设置流程
- 全部硬触发时数据采集顺序完全由外部信号给出,相机工作流程与单台一致,这里不做重复说明,请参考其他例程
API说明
- GetTriggerCount 获取软触发状态
int GetTriggerCount( camera_obj)
- 函数功能:获取软触发状态,当相机被触发后,完成数据采集前,该API输出的是1
- 头文件:dkam_zhicamera_api.h
- 参数:camera_obj:相机的结构体指针
- 返回值:0:相机未被触发;1:相机处于被触发中; 其他非0:获取失败
- ReadRegister 读寄存器
int ReadRegister(Camera_Object_C* camera_obj, unsigned int register_addr, int *data)
- 函数功能:获取相机中某个寄存器的值
- 头文件:dkam_zhicamera_api.h
- 参数:camera_obj:相机的结构体指针;register_addr:寄存器地址 ;data:最后获取的 int 类型寄存器的值;
- 返回值:0:读取成功;非0:读取失败
例程及注释
// MultiCam.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#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_zhisensor!" << std::endl;
std::vector<DiscoveryInfo> discovery_info;
Discovery discovery;
GigeCamera camera1st;
GigeCamera camera2nd;
GigeCamera camera3rd;
GigeStream* pointgigestream1st = NULL;
GigeStream* graygigestream1st = NULL;
GigeStream* rgbgigestream1st = NULL;
GigeStream* pointgigestream2nd = NULL;
GigeStream* graygigestream2nd = NULL;
GigeStream* rgbgigestream2nd = NULL;
GigeStream* pointgigestream3rd = NULL;
GigeStream* graygigestream3rd = NULL;
GigeStream* rgbgigestream3rd = 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 fi = -1;
int se = -1;
int th = -1;
for (int i = 0; i < camer_num; i++)
{
if (strcmp((discovery.ConvertIpIntToString(discovery_info[i].camera_ip)), "169.254.28.255") == 0)
{
fi = i;
std::cout << "将连接第" << i + 1 << "台相机作为第一台相机" << std::endl;
}
if (strcmp((discovery.ConvertIpIntToString(discovery_info[i].camera_ip)), "169.254.187.158") == 0)
{
se = i;
std::cout << "将连接第" << i + 1 << "台相机作为第二台相机" << std::endl;
}
if (strcmp((discovery.ConvertIpIntToString(discovery_info[i].camera_ip)), "169.254.200.25") == 0)
{
th = i;
std::cout << "将连接第" << i + 1 << "台相机作为第三台相机" << std::endl;
}
}
std::cout << "===========================================" << std::endl;
if (fi < 0 || se < 0 || th < 0) {
return 0;
}
int connect1st = camera1st.CameraConnect(&discovery_info[fi]);
int connect2nd = camera2nd.CameraConnect(&discovery_info[se]);
int connect3rd = camera3rd.CameraConnect(&discovery_info[th]);
//==============================================配置相机==============================================
if ((connect1st == 0) && (connect2nd == 0) && (connect3rd == 0))
{
// 获取第一台相机的红外镜头的宽和高
int width1st = -1;
int height1st = -1;
std::cout << "获取第一台相机红外图的宽和高。。。" << std::endl;
int height1st_gray = camera1st.GetCameraHeight(&height1st, 0);
int width1st_gray = camera1st.GetCameraWidth(&width1st, 0);
std::cout << "第一台相机红外图的宽为:" << width1st << std::endl;
std::cout << "第一台相机红外图的高为:" << height1st << std::endl;
//获取第一台相机的RGB的宽和高,如相机不支持则无此项
int width1st_RGB = -1;
int height1st_RGB = -1;
std::cout << "获取第一台相机RGB图的宽和高。。。" << std::endl;
int height1st_rgb = camera1st.GetCameraHeight(&height1st_RGB, 1);
int width1st_rgb = camera1st.GetCameraWidth(&width1st_RGB, 1);
std::cout << "第一台相机RGB图的宽为" << width1st_RGB << std::endl;
std::cout << "第一台相机RGB图的高为" << height1st_RGB << std::endl;
// 获取第二台相机的红外镜头的宽和高
int width2nd = -1;
int height2nd = -1;
std::cout << "获取第二台相机红外图的宽和高。。。" << std::endl;
int height2nd_gray = camera2nd.GetCameraHeight(&height2nd, 0);
int width2nd_gray = camera2nd.GetCameraWidth(&width2nd, 0);
std::cout << "第二台相机红外图的宽为:" << width2nd << std::endl;
std::cout << "第二台相机红外图的高为:" << height2nd << std::endl;
//获取第二台相机的RGB的宽和高,如相机不支持则无此项
int width2nd_RGB = -1;
int height2nd_RGB = -1;
std::cout << "获取第二台相机RGB图的宽和高。。。" << std::endl;
int height2nd_rgb = camera2nd.GetCameraHeight(&height2nd_RGB, 1);
int width2nd_rgb = camera2nd.GetCameraWidth(&width2nd_RGB, 1);
std::cout << "第二台相机RGB图的宽为" << width2nd_RGB << std::endl;
std::cout << "第二台相机RGB图的高为" << height2nd_RGB << std::endl;
// 获取第三台相机的红外镜头的宽和高
int width3rd = -1;
int height3rd = -1;
std::cout << "获取第三台相机红外图的宽和高。。。" << std::endl;
int height3rd_gray = camera3rd.GetCameraHeight(&height3rd, 0);
int width3rd_gray = camera3rd.GetCameraWidth(&width3rd, 0);
std::cout << "第三台相机红外图的宽为:" << width3rd << std::endl;
std::cout << "第三台相机红外图的高为:" << height3rd << std::endl;
//获取第三台相机的RGB的宽和高,如相机不支持则无此项
int width3rd_RGB = -1;
int height3rd_RGB = -1;
std::cout << "获取第三台相机RGB图的宽和高。。。" << std::endl;
int height3rd_rgb = camera3rd.GetCameraHeight(&height3rd_RGB, 1);
int width3rd_rgb = camera3rd.GetCameraWidth(&width3rd_RGB, 1);
std::cout << "第三台相机RGB图的宽为" << width3rd_RGB << std::endl;
std::cout << "第三台相机RGB图的高为" << height3rd_RGB << std::endl;
std::cout << "===========================================" << std::endl;
//定义第一台相机的数据
//灰度图
PhotoInfo* gray1st_data = new PhotoInfo;
gray1st_data->pixel = new char[width1st * height1st];
memset(gray1st_data->pixel, 0, width1st * height1st);
//点云
PhotoInfo* point1st_data = new PhotoInfo;
point1st_data->pixel = new char[width1st * height1st * 6];
memset(point1st_data->pixel, 0, width1st * height1st * 6);
//RGB
PhotoInfo* RGB1st_data = new PhotoInfo;
RGB1st_data->pixel = new char[width1st_RGB * height1st_RGB * 3];
memset(RGB1st_data->pixel, 0, width1st_RGB * height1st_RGB * 3);
//定义第二台相机的数据
//灰度图
PhotoInfo* gray2nd_data = new PhotoInfo;
gray2nd_data->pixel = new char[width2nd * height2nd];
memset(gray2nd_data->pixel, 0, width2nd * height2nd);
//点云
PhotoInfo* point2nd_data = new PhotoInfo;
point2nd_data->pixel = new char[width2nd * height2nd * 6];
memset(point2nd_data->pixel, 0, width2nd * height2nd * 6);
//RGB
PhotoInfo* RGB2nd_data = new PhotoInfo;
RGB2nd_data->pixel = new char[width2nd_RGB * height2nd_RGB * 3];
memset(RGB2nd_data->pixel, 0, width2nd_RGB * height2nd_RGB * 3);
//定义第三台相机的数据
//灰度图
PhotoInfo* gray3rd_data = new PhotoInfo;
gray3rd_data->pixel = new char[width3rd * height3rd];
memset(gray3rd_data->pixel, 0, width3rd * height3rd);
//点云
PhotoInfo* point3rd_data = new PhotoInfo;
point3rd_data->pixel = new char[width3rd * height3rd * 6];
memset(point3rd_data->pixel, 0, width3rd * height3rd * 6);
//RGB
PhotoInfo* RGB3rd_data = new PhotoInfo;
RGB3rd_data->pixel = new char[width3rd_RGB * height3rd_RGB * 3];
memset(RGB3rd_data->pixel, 0, width3rd_RGB * height3rd_RGB * 3);
//=============设置为触发模式
//第一台相机
int tirggerMode1st = camera1st.SetTriggerMode(1);
if (tirggerMode1st == 0)
{
std::cout << "设置第一台相机的点云和红外图为触发模式成功!" << std::endl;
}
else
{
std::cout << "设置第一台相机点云和红外图为触发模式失败!!!" << std::endl;
}
int tirggerModergb1st = camera1st.SetRGBTriggerMode(1);
if (tirggerModergb1st == 0)
{
std::cout << "设置第一台相机RGB图为触发模式成功!" << std::endl;
}
else
{
std::cout << "设置第一台相机RGB图为触发模式失败!!!" << std::endl;
}
//第二台相机
int tirggerMode2nd = camera2nd.SetTriggerMode(1);
if (tirggerMode2nd == 0)
{
std::cout << "设置第二台相机的点云和红外图为触发模式成功!" << std::endl;
}
else
{
std::cout << "设置第二台相机点云和红外图为触发模式失败!!!" << std::endl;
}
int tirggerModergb2nd = camera2nd.SetRGBTriggerMode(1);
if (tirggerModergb2nd == 0)
{
std::cout << "设置第二台相机RGB图为触发模式成功!" << std::endl;
}
else
{
std::cout << "设置第二台相机RGB图为触发模式失败!!!" << std::endl;
}
//第三台相机
int tirggerMode3rd = camera3rd.SetTriggerMode(1);
if (tirggerMode3rd == 0)
{
std::cout << "设置第三台相机的点云和红外图为触发模式成功!" << std::endl;
}
else
{
std::cout << "设置第三台相机点云和红外图为触发模式失败!!!" << std::endl;
}
int tirggerModergb3rd = camera3rd.SetRGBTriggerMode(1);
if (tirggerModergb3rd == 0)
{
std::cout << "设置第三台相机RGB图为触发模式成功!" << std::endl;
}
else
{
std::cout << "设置第三台相机RGB图为触发模式失败!!!" << std::endl;
}
std::cout << "===========================================" << std::endl;
//=============设置触发源
//设置触发源,该函数同时设置点云、红外和RGB:0 软触发,1 硬触发
//第一台
int tirggersource1st = camera1st.SetTriggerSource(0);
if (tirggersource1st == 0)
{
std::cout << "设置第一台相机软触发成功!" << std::endl;
}
else
{
std::cout << "设置第一台相机触发源失败!!!" << std::endl;
}
//第二台
int tirggersource2nd = camera2nd.SetTriggerSource(0);
if (tirggersource2nd == 0)
{
std::cout << "设置第二台相机软触发成功!" << std::endl;
}
else
{
std::cout << "设置第二台相机触发源失败!!!" << std::endl;
}
//第三台
int tirggersource3rd = camera3rd.SetTriggerSource(0);
if (tirggersource3rd == 0)
{
std::cout << "设置第三台相机软触发成功!" << std::endl;
}
else
{
std::cout << "设置第三台相机触发源失败!!!" << std::endl;
}
std::cout << "===========================================" << std::endl;
//==============================================开启相机数据通道==============================================
//开启数据流通道(0:红外 1:点云 2:RGB)
//第一台
int stream1st_gray = camera1st.StreamOn(0, &graygigestream1st);
if (stream1st_gray == 0)
{
std::cout << "第一台相机红外图通道打开成功!" << std::endl;
}
else
{
std::cout << "第一台相机红外图通道打开失败!!!" << std::endl;
}
int stream1st_point = camera1st.StreamOn(1, &pointgigestream1st);
if (stream1st_point == 0)
{
std::cout << "第一台相机点云通道打开成功!" << std::endl;
}
else
{
std::cout << "第一台相机点云通道打开失败!!!" << std::endl;
}
int stream1st_RGB = camera1st.StreamOn(2, &rgbgigestream1st);
if (stream1st_RGB == 0)
{
std::cout << "第一台相机RGB图通道打开成功!" << std::endl;
}
else
{
std::cout << "第一台相机RGB图通道打开失败!!!" << std::endl;
}
//第二台
int stream2nd_gray = camera2nd.StreamOn(0, &graygigestream2nd);
if (stream2nd_gray == 0)
{
std::cout << "第二台相机红外图通道打开成功!" << std::endl;
}
else
{
std::cout << "第二台相机红外图通道打开失败!!!" << std::endl;
}
int stream2nd_point = camera2nd.StreamOn(1, &pointgigestream2nd);
if (stream2nd_point == 0)
{
std::cout << "第二台相机点云通道打开成功!" << std::endl;
}
else
{
std::cout << "第二台相机点云通道打开失败!!!" << std::endl;
}
int stream2nd_RGB = camera2nd.StreamOn(2, &rgbgigestream2nd);
if (stream2nd_RGB == 0)
{
std::cout << "第二台相机RGB图通道打开成功!" << std::endl;
}
else
{
std::cout << "第二台相机RGB图通道打开失败!!!" << std::endl;
}
//第三台
int stream3rd_gray = camera3rd.StreamOn(0, &graygigestream3rd);
if (stream3rd_gray == 0)
{
std::cout << "第三台相机红外图通道打开成功!" << std::endl;
}
else
{
std::cout << "第三台相机红外图通道打开失败!!!" << std::endl;
}
int stream3rd_point = camera3rd.StreamOn(1, &pointgigestream3rd);
if (stream3rd_point == 0)
{
std::cout << "第三台相机点云通道打开成功!" << std::endl;
}
else
{
std::cout << "第三台相机点云通道打开失败!!!" << std::endl;
}
int stream3rd_RGB = camera3rd.StreamOn(2, &rgbgigestream3rd);
if (stream3rd_RGB == 0)
{
std::cout << "第三台相机RGB图通道打开成功!" << std::endl;
}
else
{
std::cout << "第三台相机RGB图通道打开失败!!!" << std::endl;
}
std::cout << "===========================================" << std::endl;
//开始接受数据
int acquistion1st = camera1st.AcquisitionStart();
if (acquistion1st == 0)
{
std::cout << "第一台相机可以开始接受数据!" << std::endl;
}
int acquistion2nd = camera2nd.AcquisitionStart();
if (acquistion2nd == 0)
{
std::cout << "第二台相机可以开始接受数据!" << std::endl;
}
int acquistion3rd = camera3rd.AcquisitionStart();
if (acquistion3rd == 0)
{
std::cout << "第三台相机可以开始接受数据!" << std::endl;
}
//刷新缓冲区数据
pointgigestream1st->FlushBuffer();
graygigestream1st ->FlushBuffer();
rgbgigestream1st ->FlushBuffer();
pointgigestream2nd->FlushBuffer();
graygigestream2nd ->FlushBuffer();
rgbgigestream2nd ->FlushBuffer();
pointgigestream3rd->FlushBuffer();
graygigestream3rd ->FlushBuffer();
rgbgigestream3rd ->FlushBuffer();
std::cout << "===========================================" << std::endl;
//==============================================触发相机:软触发==============================================
//触发第一台相机
int trigger1st = camera1st.SetTriggerCount();
if (trigger1st == 0)
{
std::cout << "第一台相机点云和红外采集触发成功!" << std::endl;
}
else
{
std::cout << "第一台相机点云和红外采集触发失败!!!" << std::endl;
}
//触发采集RGB
int triggerRGB1st = camera1st.SetRGBTriggerCount();
if (triggerRGB1st == 0)
{
std::cout << "第一台相机RGB采集触发成功!" << std::endl;
}
else
{
std::cout << "第一台相机RGB采集触发失败!!!" << std::endl;
}
std::cout << camera1st.GetTriggerCount() << std::endl;
//等待第一台相机数据采集
while (camera1st.GetTriggerCount() == 1)
{
//Sleep(30);
}
//触发第二台相机
int trigger2nd = camera2nd.SetTriggerCount();
if (trigger2nd == 0)
{
std::cout << "第二台相机点云和红外采集触发成功!" << std::endl;
}
else
{
std::cout << "第二台相机点云和红外采集触发失败!!!" << std::endl;
}
//触发采集RGB
int triggerRGB2nd = camera2nd.SetRGBTriggerCount();
if (triggerRGB2nd == 0)
{
std::cout << "第二台相机RGB采集触发成功!" << std::endl;
}
else
{
std::cout << "第二台相机RGB采集触发失败!!!" << std::endl;
}
//等待第二台相机数据采集
while (camera2nd.GetTriggerCount() == 1)
{
//Sleep(30);
}
//触发第三台相机
int trigger3rd = camera3rd.SetTriggerCount();
if (trigger3rd == 0)
{
std::cout << "第三台相机点云和红外采集触发成功!" << std::endl;
}
else
{
std::cout << "第三台相机点云和红外采集触发失败!!!" << std::endl;
}
//触发采集RGB
int triggerRGB3rd = camera3rd.SetRGBTriggerCount();
if (triggerRGB3rd == 0)
{
std::cout << "第三台相机RGB采集触发成功!" << std::endl;
}
else
{
std::cout << "第三台相机RGB采集触发失败!!!" << std::endl;
}
std::cout << "===========================================" << std::endl;
//==============================================传输数据==============================================
//===========第一台相机
//采集点云
int capturePoint1st = -1;
capturePoint1st = pointgigestream1st->TimeoutCapture(point1st_data, 6000000);
if (capturePoint1st == 0)
{
std::cout << "第一台相机点云接收成功!" << std::endl;
}
else
{
std::cout << "第一台相机点云接收失败!!!" << std::endl;
std::cout << "失败代号:" << capturePoint1st << std::endl;
}
//采集红外
int captureGray1st = -1;
captureGray1st = graygigestream1st->TimeoutCapture(gray1st_data, 6000000);
if (captureGray1st == 0)
{
std::cout << "第一台相机红外接收成功!" << std::endl;
}
else
{
std::cout << "第一台相机红外接收失败!!!" << std::endl;
std::cout << "失败代号:" << captureGray1st << std::endl;
}
//采集RGB
int captureRGB1st = -1;
captureRGB1st = rgbgigestream1st->TimeoutCapture(RGB1st_data, 3000000);
if (captureRGB1st == 0)
{
std::cout << "第一台相机RGB接收成功!" << std::endl;
}
else
{
std::cout << "第一台相机RGB接收失败!!!" << std::endl;
std::cout << "失败代号:" << captureRGB1st << std::endl;
}
//===========第二台相机
//采集点云
int capturePoint2nd = -1;
capturePoint2nd = pointgigestream2nd->TimeoutCapture(point2nd_data, 6000000);
if (capturePoint2nd == 0)
{
std::cout << "第二台相机点云接收成功!" << std::endl;
}
else
{
std::cout << "第二台相机点云接收失败!!!" << std::endl;
std::cout << "失败代号:" << capturePoint2nd << std::endl;
}
//采集红外
int captureGray2nd = -1;
captureGray2nd = graygigestream2nd->TimeoutCapture(gray2nd_data, 6000000);
if (captureGray2nd == 0)
{
std::cout << "第二台相机红外接收成功!" << std::endl;
}
else
{
std::cout << "第二台相机红外接收失败!!!" << std::endl;
std::cout << "失败代号:" << captureGray1st << std::endl;
}
//采集RGB
int captureRGB2nd = -1;
captureRGB2nd = rgbgigestream2nd->TimeoutCapture(RGB2nd_data, 3000000);
if (captureRGB2nd == 0)
{
std::cout << "第二台相机RGB接收成功!" << std::endl;
}
else
{
std::cout << "第二台相机RGB接收失败!!!" << std::endl;
std::cout << "失败代号:" << captureRGB2nd << std::endl;
}
//===========第三台相机
//采集点云
int capturePoint3rd = -1;
capturePoint3rd = pointgigestream3rd->TimeoutCapture(point3rd_data, 6000000);
if (capturePoint3rd == 0)
{
std::cout << "第三台相机点云接收成功!" << std::endl;
}
else
{
std::cout << "第三台相机点云接收失败!!!" << std::endl;
std::cout << "失败代号:" << capturePoint3rd << std::endl;
}
//采集红外
int captureGray3rd = -1;
captureGray3rd = graygigestream3rd->TimeoutCapture(gray3rd_data, 6000000);
if (captureGray3rd == 0)
{
std::cout << "第三台相机红外接收成功!" << std::endl;
}
else
{
std::cout << "第三台相机红外接收失败!!!" << std::endl;
std::cout << "失败代号:" << captureGray3rd << std::endl;
}
//采集RGB
int captureRGB3rd = -1;
captureRGB3rd = rgbgigestream3rd->TimeoutCapture(RGB3rd_data, 3000000);
if (captureRGB3rd == 0)
{
std::cout << "第三台相机RGB接收成功!" << std::endl;
}
else
{
std::cout << "第三台相机RGB接收失败!!!" << std::endl;
std::cout << "失败代号:" << captureRGB3rd << std::endl;
}
std::cout << "===========================================" << std::endl;
//==============================================保存数据==============================================
//===========第一台相机
//点云
int savepoint1st = camera1st.SavePointCloudToPcd(*point1st_data, (char*)"PointCloud1st.pcd");
//保存红外数据
int savegray1st = camera1st.SaveToBMP(*gray1st_data, (char*)"Gray1st.bmp");
//保存RGB数据
int savergb1st = camera1st.SaveToBMP(*RGB1st_data, (char*)"RGB1st.bmp");
if (savepoint1st == 0 && savegray1st == 0 && savergb1st == 0)
{
std::cout << "第一台相机数据保存成功!" << std::endl;
}
else
{
std::cout << "第一台相机数据保存失败!!!" << std::endl;
}
//===========第二台相机
//点云
int savepoint2nd = camera2nd.SavePointCloudToPcd(*point2nd_data, (char*)"PointCloud2nd.pcd");
//保存红外数据
int savegray2nd = camera2nd.SaveToBMP(*gray2nd_data, (char*)"Gray2nd.bmp");
//保存RGB数据
int savergb2nd = camera2nd.SaveToBMP(*RGB2nd_data, (char*)"RGB2nd.bmp");
if (savepoint2nd == 0 && savegray2nd == 0 && savergb2nd == 0)
{
std::cout << "第二台相机数据保存成功!" << std::endl;
}
else
{
std::cout << "第二台相机数据保存失败!!!" << std::endl;
}
//===========第三台相机
//点云
int savepoint3rd = camera3rd.SavePointCloudToPcd(*point3rd_data, (char*)"PointCloud3rd.pcd");
//保存红外数据
int savegray3rd = camera3rd.SaveToBMP(*gray3rd_data, (char*)"Gray3rd.bmp");
//保存RGB数据
int savergb3rd = camera3rd.SaveToBMP(*RGB3rd_data, (char*)"RGB3rd.bmp");
if (savepoint3rd == 0 && savegray3rd == 0 && savergb3rd == 0)
{
std::cout << "第三台相机数据保存成功!" << std::endl;
}
else
{
std::cout << "第三台相机数据保存失败!!!" << std::endl;
}
//**********************************************结束工作***************************************
//===========第一台相机
memset(point1st_data->pixel, 0, width1st * height1st * 6);
memset(gray1st_data->pixel, 0, width1st* height1st);
memset(RGB1st_data->pixel, 0, width1st_RGB * height1st_RGB * 3);
//释放内存
delete[] point1st_data->pixel;
delete point1st_data;
delete[] gray1st_data->pixel;
delete gray1st_data;
delete[] RGB1st_data->pixel;
delete RGB1st_data;
//关闭数据流通道
int streamoff_gray1st = camera1st.StreamOff(0, graygigestream1st);
int streamoff_point1st = camera1st.StreamOff(1, pointgigestream1st);
int streamoff_rgb1st = camera1st.StreamOff(2, rgbgigestream1st);
//断开相机连接
int disconnect1st = camera1st.CameraDisconnect();
//===========第二台相机
memset(point2nd_data->pixel, 0, width2nd* height2nd * 6);
memset(gray2nd_data->pixel, 0, width2nd * height2nd);
memset(RGB2nd_data->pixel, 0, width2nd_RGB* height2nd_RGB * 3);
//释放内存
delete[] point2nd_data->pixel;
delete point2nd_data;
delete[] gray2nd_data->pixel;
delete gray2nd_data;
delete[] RGB2nd_data->pixel;
delete RGB2nd_data;
//关闭数据流通道
int streamoff_gray2nd = camera2nd.StreamOff(0, graygigestream2nd);
int streamoff_point2nd = camera2nd.StreamOff(1, pointgigestream2nd);
int streamoff_rgb2nd = camera2nd.StreamOff(2, rgbgigestream2nd);
//断开相机连接
int disconnect2nd = camera2nd.CameraDisconnect();
//===========第三台相机
memset(point3rd_data->pixel, 0, width3rd * height3rd * 6);
memset(gray3rd_data->pixel, 0, width3rd* height3rd);
memset(RGB3rd_data->pixel, 0, width3rd_RGB * height3rd_RGB * 3);
//释放内存
delete[] point3rd_data->pixel;
delete point3rd_data;
delete[] gray3rd_data->pixel;
delete gray3rd_data;
delete[] RGB3rd_data->pixel;
delete RGB3rd_data;
//关闭数据流通道
int streamoff_gray3rd = camera3rd.StreamOff(0, graygigestream3rd);
int streamoff_point3rd = camera3rd.StreamOff(1, pointgigestream3rd);
int streamoff_rgb3rd = camera3rd.StreamOff(2, rgbgigestream3rd);
//断开相机连接
int disconnect3rd = camera3rd.CameraDisconnect();
std::cout << "相机已断开连接!" << std::endl;
std::cout << "工作结束!!!!!!" << std::endl;
}
else
{
std::cout << "相机连接失败!!!" << std::endl;
std::cout << "请排查原因,代号:" << connect1st << std::endl;
}
}
//===========================第一台硬触发,其余软触发=====================================
#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_zhisensor!" << std::endl;
std::vector<DiscoveryInfo> discovery_info;
Discovery discovery;
GigeCamera camera1st;
GigeCamera camera2nd;
GigeCamera camera3rd;
GigeStream* pointgigestream1st = NULL;
GigeStream* graygigestream1st = NULL;
GigeStream* rgbgigestream1st = NULL;
GigeStream* pointgigestream2nd = NULL;
GigeStream* graygigestream2nd = NULL;
GigeStream* rgbgigestream2nd = NULL;
GigeStream* pointgigestream3rd = NULL;
GigeStream* graygigestream3rd = NULL;
GigeStream* rgbgigestream3rd = 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 fi = -1;
int se = -1;
int th = -1;
for (int i = 0; i < camer_num; i++)
{
if (strcmp((discovery.ConvertIpIntToString(discovery_info[i].camera_ip)), "169.254.107.159") == 0)
{
fi = i;
std::cout << "将连接第" << i + 1 << "台相机作为第一台相机" << std::endl;
}
if (strcmp((discovery.ConvertIpIntToString(discovery_info[i].camera_ip)), "169.254.64.13") == 0)
{
se = i;
std::cout << "将连接第" << i + 1 << "台相机作为第二台相机" << std::endl;
}
if (strcmp((discovery.ConvertIpIntToString(discovery_info[i].camera_ip)), "169.254.23.253") == 0)
{
th = i;
std::cout << "将连接第" << i + 1 << "台相机作为第三台相机" << std::endl;
}
}
std::cout << "===========================================" << std::endl;
if (fi < 0 || se < 0 || th < 0) {
return 0;
}
int connect1st = camera1st.CameraConnect(&discovery_info[fi]);
int connect2nd = camera2nd.CameraConnect(&discovery_info[se]);
int connect3rd = camera3rd.CameraConnect(&discovery_info[th]);
//==============================================配置相机==============================================
if ((connect1st == 0) && (connect2nd == 0) && (connect3rd == 0))
{
// 获取第一台相机的红外镜头的宽和高
int width1st = -1;
int height1st = -1;
std::cout << "获取第一台相机红外图的宽和高。。。" << std::endl;
int height1st_gray = camera1st.GetCameraHeight(&height1st, 0);
int width1st_gray = camera1st.GetCameraWidth(&width1st, 0);
std::cout << "第一台相机红外图的宽为:" << width1st << std::endl;
std::cout << "第一台相机红外图的高为:" << height1st << std::endl;
//获取第一台相机的RGB的宽和高,如相机不支持则无此项
int width1st_RGB = -1;
int height1st_RGB = -1;
std::cout << "获取第一台相机RGB图的宽和高。。。" << std::endl;
int height1st_rgb = camera1st.GetCameraHeight(&height1st_RGB, 1);
int width1st_rgb = camera1st.GetCameraWidth(&width1st_RGB, 1);
std::cout << "第一台相机RGB图的宽为" << width1st_RGB << std::endl;
std::cout << "第一台相机RGB图的高为" << height1st_RGB << std::endl;
// 获取第二台相机的红外镜头的宽和高
int width2nd = -1;
int height2nd = -1;
std::cout << "获取第二台相机红外图的宽和高。。。" << std::endl;
int height2nd_gray = camera2nd.GetCameraHeight(&height2nd, 0);
int width2nd_gray = camera2nd.GetCameraWidth(&width2nd, 0);
std::cout << "第二台相机红外图的宽为:" << width2nd << std::endl;
std::cout << "第二台相机红外图的高为:" << height2nd << std::endl;
//获取第二台相机的RGB的宽和高,如相机不支持则无此项
int width2nd_RGB = -1;
int height2nd_RGB = -1;
std::cout << "获取第二台相机RGB图的宽和高。。。" << std::endl;
int height2nd_rgb = camera2nd.GetCameraHeight(&height2nd_RGB, 1);
int width2nd_rgb = camera2nd.GetCameraWidth(&width2nd_RGB, 1);
std::cout << "第二台相机RGB图的宽为" << width2nd_RGB << std::endl;
std::cout << "第二台相机RGB图的高为" << height2nd_RGB << std::endl;
// 获取第三台相机的红外镜头的宽和高
int width3rd = -1;
int height3rd = -1;
std::cout << "获取第三台相机红外图的宽和高。。。" << std::endl;
int height3rd_gray = camera3rd.GetCameraHeight(&height3rd, 0);
int width3rd_gray = camera3rd.GetCameraWidth(&width3rd, 0);
std::cout << "第三台相机红外图的宽为:" << width3rd << std::endl;
std::cout << "第三台相机红外图的高为:" << height3rd << std::endl;
//获取第三台相机的RGB的宽和高,如相机不支持则无此项
int width3rd_RGB = -1;
int height3rd_RGB = -1;
std::cout << "获取第三台相机RGB图的宽和高。。。" << std::endl;
int height3rd_rgb = camera3rd.GetCameraHeight(&height3rd_RGB, 1);
int width3rd_rgb = camera3rd.GetCameraWidth(&width3rd_RGB, 1);
std::cout << "第三台相机RGB图的宽为" << width3rd_RGB << std::endl;
std::cout << "第三台相机RGB图的高为" << height3rd_RGB << std::endl;
std::cout << "===========================================" << std::endl;
//定义第一台相机的数据
//灰度图
PhotoInfo* gray1st_data = new PhotoInfo;
gray1st_data->pixel = new char[width1st * height1st];
memset(gray1st_data->pixel, 0, width1st * height1st);
//点云
PhotoInfo* point1st_data = new PhotoInfo;
point1st_data->pixel = new char[width1st * height1st * 6];
memset(point1st_data->pixel, 0, width1st * height1st * 6);
//RGB
PhotoInfo* RGB1st_data = new PhotoInfo;
RGB1st_data->pixel = new char[width1st_RGB * height1st_RGB * 3];
memset(RGB1st_data->pixel, 0, width1st_RGB * height1st_RGB * 3);
//定义第二台相机的数据
//灰度图
PhotoInfo* gray2nd_data = new PhotoInfo;
gray2nd_data->pixel = new char[width2nd * height2nd];
memset(gray2nd_data->pixel, 0, width2nd * height2nd);
//点云
PhotoInfo* point2nd_data = new PhotoInfo;
point2nd_data->pixel = new char[width2nd * height2nd * 6];
memset(point2nd_data->pixel, 0, width2nd * height2nd * 6);
//RGB
PhotoInfo* RGB2nd_data = new PhotoInfo;
RGB2nd_data->pixel = new char[width2nd_RGB * height2nd_RGB * 3];
memset(RGB2nd_data->pixel, 0, width2nd_RGB * height2nd_RGB * 3);
//定义第三台相机的数据
//灰度图
PhotoInfo* gray3rd_data = new PhotoInfo;
gray3rd_data->pixel = new char[width3rd * height3rd];
memset(gray3rd_data->pixel, 0, width3rd * height3rd);
//点云
PhotoInfo* point3rd_data = new PhotoInfo;
point3rd_data->pixel = new char[width3rd * height3rd * 6];
memset(point3rd_data->pixel, 0, width3rd * height3rd * 6);
//RGB
PhotoInfo* RGB3rd_data = new PhotoInfo;
RGB3rd_data->pixel = new char[width3rd_RGB * height3rd_RGB * 3];
memset(RGB3rd_data->pixel, 0, width3rd_RGB * height3rd_RGB * 3);
//=============设置为触发模式
//第一台相机
int tirggerMode1st = camera1st.SetTriggerMode(1);
if (tirggerMode1st == 0)
{
std::cout << "设置第一台相机的点云和红外图为触发模式成功!" << std::endl;
}
else
{
std::cout << "设置第一台相机点云和红外图为触发模式失败!!!" << std::endl;
}
int tirggerModergb1st = camera1st.SetRGBTriggerMode(1);
if (tirggerModergb1st == 0)
{
std::cout << "设置第一台相机RGB图为触发模式成功!" << std::endl;
}
else
{
std::cout << "设置第一台相机RGB图为触发模式失败!!!" << std::endl;
}
//第二台相机
int tirggerMode2nd = camera2nd.SetTriggerMode(1);
if (tirggerMode2nd == 0)
{
std::cout << "设置第二台相机的点云和红外图为触发模式成功!" << std::endl;
}
else
{
std::cout << "设置第二台相机点云和红外图为触发模式失败!!!" << std::endl;
}
int tirggerModergb2nd = camera2nd.SetRGBTriggerMode(1);
if (tirggerModergb2nd == 0)
{
std::cout << "设置第二台相机RGB图为触发模式成功!" << std::endl;
}
else
{
std::cout << "设置第二台相机RGB图为触发模式失败!!!" << std::endl;
}
//第三台相机
int tirggerMode3rd = camera3rd.SetTriggerMode(1);
if (tirggerMode3rd == 0)
{
std::cout << "设置第三台相机的点云和红外图为触发模式成功!" << std::endl;
}
else
{
std::cout << "设置第三台相机点云和红外图为触发模式失败!!!" << std::endl;
}
int tirggerModergb3rd = camera3rd.SetRGBTriggerMode(1);
if (tirggerModergb3rd == 0)
{
std::cout << "设置第三台相机RGB图为触发模式成功!" << std::endl;
}
else
{
std::cout << "设置第三台相机RGB图为触发模式失败!!!" << std::endl;
}
std::cout << "===========================================" << std::endl;
//=============设置触发源
//设置触发源,该函数同时设置点云、红外和RGB:0 软触发,1 硬触发
//第一台
int tirggersource1st = camera1st.SetTriggerSource(1);
if (tirggersource1st == 0)
{
std::cout << "设置第一台相机软触发成功!" << std::endl;
}
else
{
std::cout << "设置第一台相机触发源失败!!!" << std::endl;
}
//第二台
int tirggersource2nd = camera2nd.SetTriggerSource(0);
if (tirggersource2nd == 0)
{
std::cout << "设置第二台相机软触发成功!" << std::endl;
}
else
{
std::cout << "设置第二台相机触发源失败!!!" << std::endl;
}
//第三台
int tirggersource3rd = camera3rd.SetTriggerSource(0);
if (tirggersource3rd == 0)
{
std::cout << "设置第三台相机软触发成功!" << std::endl;
}
else
{
std::cout << "设置第三台相机触发源失败!!!" << std::endl;
}
std::cout << "===========================================" << std::endl;
//==============================================开启相机数据通道==============================================
//开启数据流通道(0:红外 1:点云 2:RGB)
//第一台
int stream1st_gray = camera1st.StreamOn(0, &graygigestream1st);
if (stream1st_gray == 0)
{
std::cout << "第一台相机红外图通道打开成功!" << std::endl;
}
else
{
std::cout << "第一台相机红外图通道打开失败!!!" << std::endl;
}
int stream1st_point = camera1st.StreamOn(1, &pointgigestream1st);
if (stream1st_point == 0)
{
std::cout << "第一台相机点云通道打开成功!" << std::endl;
}
else
{
std::cout << "第一台相机点云通道打开失败!!!" << std::endl;
}
int stream1st_RGB = camera1st.StreamOn(2, &rgbgigestream1st);
if (stream1st_RGB == 0)
{
std::cout << "第一台相机RGB图通道打开成功!" << std::endl;
}
else
{
std::cout << "第一台相机RGB图通道打开失败!!!" << std::endl;
}
//第二台
int stream2nd_gray = camera2nd.StreamOn(0, &graygigestream2nd);
if (stream2nd_gray == 0)
{
std::cout << "第二台相机红外图通道打开成功!" << std::endl;
}
else
{
std::cout << "第二台相机红外图通道打开失败!!!" << std::endl;
}
int stream2nd_point = camera2nd.StreamOn(1, &pointgigestream2nd);
if (stream2nd_point == 0)
{
std::cout << "第二台相机点云通道打开成功!" << std::endl;
}
else
{
std::cout << "第二台相机点云通道打开失败!!!" << std::endl;
}
int stream2nd_RGB = camera2nd.StreamOn(2, &rgbgigestream2nd);
if (stream2nd_RGB == 0)
{
std::cout << "第二台相机RGB图通道打开成功!" << std::endl;
}
else
{
std::cout << "第二台相机RGB图通道打开失败!!!" << std::endl;
}
//第三台
int stream3rd_gray = camera3rd.StreamOn(0, &graygigestream3rd);
if (stream3rd_gray == 0)
{
std::cout << "第三台相机红外图通道打开成功!" << std::endl;
}
else
{
std::cout << "第三台相机红外图通道打开失败!!!" << std::endl;
}
int stream3rd_point = camera3rd.StreamOn(1, &pointgigestream3rd);
if (stream3rd_point == 0)
{
std::cout << "第三台相机点云通道打开成功!" << std::endl;
}
else
{
std::cout << "第三台相机点云通道打开失败!!!" << std::endl;
}
int stream3rd_RGB = camera3rd.StreamOn(2, &rgbgigestream3rd);
if (stream3rd_RGB == 0)
{
std::cout << "第三台相机RGB图通道打开成功!" << std::endl;
}
else
{
std::cout << "第三台相机RGB图通道打开失败!!!" << std::endl;
}
std::cout << "===========================================" << std::endl;
//开始接受数据
int acquistion1st = camera1st.AcquisitionStart();
if (acquistion1st == 0)
{
std::cout << "第一台相机可以开始接受数据!" << std::endl;
}
int acquistion2nd = camera2nd.AcquisitionStart();
if (acquistion2nd == 0)
{
std::cout << "第二台相机可以开始接受数据!" << std::endl;
}
int acquistion3rd = camera3rd.AcquisitionStart();
if (acquistion3rd == 0)
{
std::cout << "第三台相机可以开始接受数据!" << std::endl;
}
//刷新缓冲区数据
pointgigestream1st->FlushBuffer();
graygigestream1st->FlushBuffer();
rgbgigestream1st->FlushBuffer();
pointgigestream2nd->FlushBuffer();
graygigestream2nd->FlushBuffer();
rgbgigestream2nd->FlushBuffer();
pointgigestream3rd->FlushBuffer();
graygigestream3rd->FlushBuffer();
rgbgigestream3rd->FlushBuffer();
std::cout << "===========================================" << std::endl;
//==============================================触发相机:第一台硬触发,其余软触发==============================================
std::cout << "等待第一台相机硬触发信号···" << std::endl;
//检测第一台相机触发信号, 循环读寄存器值,当该值从0变为1时表示有触发信号进来
int data = 0;
int status = -1;
while (data == 0)
{
status = camera1st.ReadRegister(0xB024, &data);
if (status != 0)
{
std::cout << "相机出错,检查错误码" << std::endl;
return status;
}
}
// 检测第一台相机触发结束信号,循环读寄存器值,当该值从1变为0时表示触发信号结束,可以进行下一台相机触发
while (data == 1) {
status = camera1st.ReadRegister(0xB024, &data);
if (status != 0)
{
std::cout << "相机出错,检查错误码" << std::endl;
return status;
}
}
//触发第二台相机
int trigger2nd = camera2nd.SetTriggerCount();
if (trigger2nd == 0)
{
std::cout << "第二台相机点云和红外采集触发成功!" << std::endl;
}
else
{
std::cout << "第二台相机点云和红外采集触发失败!!!" << trigger2nd<< std::endl;
}
//触发采集RGB
int triggerRGB2nd = camera2nd.SetRGBTriggerCount();
if (triggerRGB2nd == 0)
{
std::cout << "第二台相机RGB采集触发成功!" << std::endl;
}
else
{
std::cout << "第二台相机RGB采集触发失败!!!" << std::endl;
}
//等待第二台相机数据采集
while (camera2nd.GetTriggerCount() == 1)
{
//Sleep(30);
}
//触发第三台相机
int trigger3rd = camera3rd.SetTriggerCount();
if (trigger3rd == 0)
{
std::cout << "第三台相机点云和红外采集触发成功!" << std::endl;
}
else
{
std::cout << "第三台相机点云和红外采集触发失败!!!" << std::endl;
}
//触发采集RGB
int triggerRGB3rd = camera3rd.SetRGBTriggerCount();
if (triggerRGB3rd == 0)
{
std::cout << "第三台相机RGB采集触发成功!" << std::endl;
}
else
{
std::cout << "第三台相机RGB采集触发失败!!!" << std::endl;
}
std::cout << "===========================================" << std::endl;
//==============================================传输数据==============================================
//===========第一台相机
//采集点云
int capturePoint1st = -1;
capturePoint1st = pointgigestream1st->TimeoutCapture(point1st_data, 6000000);
if (capturePoint1st == 0)
{
std::cout << "第一台相机点云接收成功!" << std::endl;
}
else
{
std::cout << "第一台相机点云接收失败!!!" << std::endl;
std::cout << "失败代号:" << capturePoint1st << std::endl;
}
//采集红外
int captureGray1st = -1;
captureGray1st = graygigestream1st->TimeoutCapture(gray1st_data, 6000000);
if (captureGray1st == 0)
{
std::cout << "第一台相机红外接收成功!" << std::endl;
}
else
{
std::cout << "第一台相机红外接收失败!!!" << std::endl;
std::cout << "失败代号:" << captureGray1st << std::endl;
}
//采集RGB
int captureRGB1st = -1;
captureRGB1st = rgbgigestream1st->TimeoutCapture(RGB1st_data, 6000000);
if (captureRGB1st == 0)
{
std::cout << "第一台相机RGB接收成功!" << std::endl;
}
else
{
std::cout << "第一台相机RGB接收失败!!!" << std::endl;
std::cout << "失败代号:" << captureRGB1st << std::endl;
}
//===========第二台相机
//采集点云
int capturePoint2nd = -1;
capturePoint2nd = pointgigestream2nd->TimeoutCapture(point2nd_data, 6000000);
if (capturePoint2nd == 0)
{
std::cout << "第二台相机点云接收成功!" << std::endl;
}
else
{
std::cout << "第二台相机点云接收失败!!!" << std::endl;
std::cout << "失败代号:" << capturePoint2nd << std::endl;
}
//采集红外
int captureGray2nd = -1;
captureGray2nd = graygigestream2nd->TimeoutCapture(gray2nd_data, 6000000);
if (captureGray2nd == 0)
{
std::cout << "第二台相机红外接收成功!" << std::endl;
}
else
{
std::cout << "第二台相机红外接收失败!!!" << std::endl;
std::cout << "失败代号:" << captureGray1st << std::endl;
}
//采集RGB
int captureRGB2nd = -1;
captureRGB2nd = rgbgigestream2nd->TimeoutCapture(RGB2nd_data, 6000000);
if (captureRGB2nd == 0)
{
std::cout << "第二台相机RGB接收成功!" << std::endl;
}
else
{
std::cout << "第二台相机RGB接收失败!!!" << std::endl;
std::cout << "失败代号:" << captureRGB2nd << std::endl;
}
//===========第三台相机
//采集点云
int capturePoint3rd = -1;
capturePoint3rd = pointgigestream3rd->TimeoutCapture(point3rd_data, 6000000);
if (capturePoint3rd == 0)
{
std::cout << "第三台相机点云接收成功!" << std::endl;
}
else
{
std::cout << "第三台相机点云接收失败!!!" << std::endl;
std::cout << "失败代号:" << capturePoint3rd << std::endl;
}
//采集红外
int captureGray3rd = -1;
captureGray3rd = graygigestream3rd->TimeoutCapture(gray3rd_data, 6000000);
if (captureGray3rd == 0)
{
std::cout << "第三台相机红外接收成功!" << std::endl;
}
else
{
std::cout << "第三台相机红外接收失败!!!" << std::endl;
std::cout << "失败代号:" << captureGray3rd << std::endl;
}
//采集RGB
int captureRGB3rd = -1;
captureRGB3rd = rgbgigestream3rd->TimeoutCapture(RGB3rd_data, 6000000);
if (captureRGB3rd == 0)
{
std::cout << "第三台相机RGB接收成功!" << std::endl;
}
else
{
std::cout << "第三台相机RGB接收失败!!!" << std::endl;
std::cout << "失败代号:" << captureRGB3rd << std::endl;
}
std::cout << "===========================================" << std::endl;
//==============================================保存数据==============================================
//===========第一台相机
//点云
int savepoint1st = camera1st.SavePointCloudToPcd(*point1st_data, (char*)"PointCloud1st.pcd");
//保存红外数据
int savegray1st = camera1st.SaveToBMP(*gray1st_data, (char*)"Gray1st.bmp");
//保存RGB数据
int savergb1st = camera1st.SaveToBMP(*RGB1st_data, (char*)"RGB1st.bmp");
if (savepoint1st == 0 && savegray1st == 0 && savergb1st == 0)
{
std::cout << "第一台相机数据保存成功!" << std::endl;
}
else
{
std::cout << "第一台相机数据保存失败!!!" << std::endl;
}
//===========第二台相机
//点云
int savepoint2nd = camera2nd.SavePointCloudToPcd(*point2nd_data, (char*)"PointCloud2nd.pcd");
//保存红外数据
int savegray2nd = camera2nd.SaveToBMP(*gray2nd_data, (char*)"Gray2nd.bmp");
//保存RGB数据
int savergb2nd = camera2nd.SaveToBMP(*RGB2nd_data, (char*)"RGB2nd.bmp");
if (savepoint2nd == 0 && savegray2nd == 0 && savergb2nd == 0)
{
std::cout << "第二台相机数据保存成功!" << std::endl;
}
else
{
std::cout << "第二台相机数据保存失败!!!" << std::endl;
}
//===========第三台相机
//点云
int savepoint3rd = camera3rd.SavePointCloudToPcd(*point3rd_data, (char*)"PointCloud3rd.pcd");
//保存红外数据
int savegray3rd = camera3rd.SaveToBMP(*gray3rd_data, (char*)"Gray3rd.bmp");
//保存RGB数据
int savergb3rd = camera3rd.SaveToBMP(*RGB3rd_data, (char*)"RGB3rd.bmp");
if (savepoint3rd == 0 && savegray3rd == 0 && savergb3rd == 0)
{
std::cout << "第三台相机数据保存成功!" << std::endl;
}
else
{
std::cout << "第三台相机数据保存失败!!!" << std::endl;
}
//**********************************************结束工作***************************************
//===========第一台相机
memset(point1st_data->pixel, 0, width1st * height1st * 6);
memset(gray1st_data->pixel, 0, width1st * height1st);
memset(RGB1st_data->pixel, 0, width1st_RGB * height1st_RGB * 3);
//释放内存
delete[] point1st_data->pixel;
delete point1st_data;
delete[] gray1st_data->pixel;
delete gray1st_data;
delete[] RGB1st_data->pixel;
delete RGB1st_data;
//关闭数据流通道
int streamoff_gray1st = camera1st.StreamOff(0, graygigestream1st);
int streamoff_point1st = camera1st.StreamOff(1, pointgigestream1st);
int streamoff_rgb1st = camera1st.StreamOff(2, rgbgigestream1st);
//断开相机连接
int disconnect1st = camera1st.CameraDisconnect();
//===========第二台相机
memset(point2nd_data->pixel, 0, width2nd * height2nd * 6);
memset(gray2nd_data->pixel, 0, width2nd * height2nd);
memset(RGB2nd_data->pixel, 0, width2nd_RGB * height2nd_RGB * 3);
//释放内存
delete[] point2nd_data->pixel;
delete point2nd_data;
delete[] gray2nd_data->pixel;
delete gray2nd_data;
delete[] RGB2nd_data->pixel;
delete RGB2nd_data;
//关闭数据流通道
int streamoff_gray2nd = camera2nd.StreamOff(0, graygigestream2nd);
int streamoff_point2nd = camera2nd.StreamOff(1, pointgigestream2nd);
int streamoff_rgb2nd = camera2nd.StreamOff(2, rgbgigestream2nd);
//断开相机连接
int disconnect2nd = camera2nd.CameraDisconnect();
//===========第三台相机
memset(point3rd_data->pixel, 0, width3rd * height3rd * 6);
memset(gray3rd_data->pixel, 0, width3rd * height3rd);
memset(RGB3rd_data->pixel, 0, width3rd_RGB * height3rd_RGB * 3);
//释放内存
delete[] point3rd_data->pixel;
delete point3rd_data;
delete[] gray3rd_data->pixel;
delete gray3rd_data;
delete[] RGB3rd_data->pixel;
delete RGB3rd_data;
//关闭数据流通道
int streamoff_gray3rd = camera3rd.StreamOff(0, graygigestream3rd);
int streamoff_point3rd = camera3rd.StreamOff(1, pointgigestream3rd);
int streamoff_rgb3rd = camera3rd.StreamOff(2, rgbgigestream3rd);
//断开相机连接
int disconnect3rd = camera3rd.CameraDisconnect();
std::cout << "相机已断开连接!" << std::endl;
std::cout << "工作结束!!!!!!" << std::endl;
}
else
{
std::cout << "相机连接失败!!!" << std::endl;
std::cout << "请排查原因,代号:" << connect1st << std::endl;
}
}
运行结果
- 全部软触发示例工作正常
- 第一台硬触发其余软触发示例工作正常,如图
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/b18167f2d9aa40878fc4d4b6a03bdbf5.png#pic_center)
后记
- 项目中可以固定相机的IP方便设定相机的数据采集顺序
- 知微传感Dkam系列3D相机可以应用于定位分拣、焊接引导、逆向建模、检测测量等领域
- 如有问题,欢迎与我深入交流:微信号:liu_zhisensor