知微传感Dkam系列3D相机SDK例程篇:连接多台相机并串联触发

同时连接多台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;
	}

}

运行结果

  • 全部软触发示例工作正常
  • 第一台硬触发其余软触发示例工作正常,如图
    在这里插入图片描述

后记

  • 项目中可以固定相机的IP方便设定相机的数据采集顺序
  • 知微传感Dkam系列3D相机可以应用于定位分拣、焊接引导、逆向建模、检测测量等领域
  • 如有问题,欢迎与我深入交流:微信号:liu_zhisensor
  • 24
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值