设置3D相机触发模式 写在前面 本人从事机器视觉细分的3D相机行业。编写此系列文章主要目的有:1、便利他人应用3D相机,本系列文章包含公司所出售相机的SDK的使用例程及详细注释; 2、促进行业发展及交流。 欢迎与我深入交流:Liu_Gump_ 设置触发模式及API说明 触发模式说明 知微传感Dkam系列3D相机拥有连续模式和触发模式两种工作模式 连续模式是3D相机主动采集数据并不断更新输出 触发模式是3D相机在收到触发信号后才会采集数据并更新输出 知微传感Dkam系列3D相机具备软触发功能 知微传感Dkam系列3D相机除D2xx和D300外均具备硬触发功能 软触发即发送数据采集命令后采集一次数据,硬触发即有外部电触发信号后采集一次数据 硬触发的电气连线方式、电气要求和电气逻辑请参考3D相机说明书 设置流程 主要API SetTriggerMode 设置点云和红外的工作模式int SetTriggerMode(Camera_Object_C* camera_obj,int mode) 函数功能: 设置点云、红外触发模式 参 数: camera_obj:相机的结构体指针 参数:mode:模式选择(0 连续 1 触发) 返回值: 0:设置成功 非 0:设置失败 SetRGBTriggerMode 设置RGB的工作模式int SetRGBTriggerMode(Camera_Object_C* camera_obj,int mode) 函数功能: 设置 RGB 触发模式 参 数: camera_obj:相机的结构体指针 参数:mode:模式选择(0 连续 1 触发) 返回值: 0:设置成功 非 0:设置失败 SetTriggerSource 触发源int SetTriggerSource(Camera_Object_C* camera_obj, int sourcetype) 函数功能:设置相机软/硬触发 参数:camera_obj:相机的结构体指针 参数:sourcetype:相机触发类型(0:软触发 1:硬触发) 返回值:0:设置成功 小于 0:设置失败 注:该API同时设置红外、点云和RGB的触发源 SetTriggerCount 触发红外和点云int SetTriggerCount() 函数功能: 触发相机采集点云和红外数据 参 数: 无 返回值: 0:设置成功 非 0:设置失败 SetRGBTriggerCount 触发RGBint SetRGBTriggerCount() 函数功能: 触发相机采集RGB数据 参 数: 无 返回值: 0:设置成功 非 0:设置失败 例程及注释 本例程基于WIN10+VisualStudio2019+DkamSDK_1.6.71,采用C++语言 DkamSDK的配置方法请参考SDK说明书 本例程在D132S型相机上验证 #include <iostream> #include <cstring> //DkamSDK #include"dkam_discovery.h" #include"dkam_gige_camera.h" #include"dkam_gige_stream.h" int main() { std::cout << "Hello ZhiSENSOR!\n"; 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)), "192.168.30.35") == 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 触发模式 int GrayMode = 1; if (GrayMode == 1) { std::cout << "设置点云和红外图的工作模式为触发模式。。。" << std::endl; } else { std::cout << "设置点云和红外图的工作模式为连拍模式。。。" << std::endl; } int tirggerMode = camera.SetTriggerMode(GrayMode); if (tirggerMode == 0) { std::cout << "设置点云和红外图为触发模式成功!" << std::endl; } else { std::cout << "设置点云和红外图为触发模式失败!!!" << std::endl; } //设置相机RGB工作模式: 0 连拍模式 1 触发模式 int RGBMode = 1; if (RGBMode == 1) { std::cout << "设置RGB图的工作模式为触发模式。。。" << std::endl; } else { std::cout << "设置RGB图的工作模式为连拍模式。。。" << std::endl; } int tirggerModergb = camera.SetRGBTriggerMode(1); if (tirggerModergb == 0) { std::cout << "设置RGB图为触发模式成功!" << std::endl; } else { std::cout << "设置RGB图为触发模式失败!!!" << std::endl; } //设置触发源,该函数同时设置点云、红外和RGB:0 软触发,1 硬触发 int TrigSour = 0; if (TrigSour == 0) { std::cout << "设置触发源为软触发。。。" << std::endl; } else { std::cout << "设置触发源为硬触发。。。" << std::endl; } int tirggersource = camera.SetTriggerSource(TrigSour); if (tirggersource == 0) { std::cout << "设置触发源成功!" << std::endl; } else { std::cout << "设置触发源失败!!!" << std::endl; } //**********************************************打开数据通道**************************************************** //开启数据流通道(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(); //**********************************************触发相机:软触发*************************************** //触发采集点云和红外 int triggerCount = camera.SetTriggerCount(); if (triggerCount == 0) { std::cout << "点云和红外采集触发成功!" << std::endl; } else { std::cout << "点云和红外采集触发失败!!!" << std::endl; } //触发采集RGB int triggerCountRGB = camera.SetRGBTriggerCount(); if (triggerCountRGB == 0) { std::cout << "RGB采集触发成功!" << std::endl; } else { std::cout << "RGB采集触发失败!!!" << std::endl; } std::cout << "等待数据采集、传输。。。" << std::endl; //**********************************************等待相机上传数据*************************************** //采集点云 int capturePoint = -1; capturePoint = pointgigestream->TimeoutCapture(point_data, 3000000); 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*)"1.pcd"); if (savepoint == 0) { std::cout << "点云保存成功!" << std::endl; } else { std::cout << "点云保存失败!!!" << std::endl; } //保存红外数据 int savegray = camera.SaveToBMP(*gray_data, (char*)"1.bmp"); if (savegray == 0) { std::cout << "红外图保存成功!" << std::endl; } else { std::cout << "红外图保存失败!!!" << std::endl; } //保存RGB数据 int savergb = camera.SaveToBMP(*RGB_data, (char*)"1_rgb.bmp"); if (savergb == 0) { std::cout << "RGB图保存成功!" << std::endl; } else { std::cout << "RGB图保存失败!!!" << std::endl; } //保存深度图 int savedepth = camera.SaveDepthToPng(*point_data, (char*)"1.png"); if (savedepth == 0) { std::cout << "深度图保存成功!" << std::endl; } else { std::cout << "深度图保存失败!!!" << 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; }输出
后记 触发模式下3D相机为主动工作,触发后上位机等待相机拍摄完成并上传,期间3D相机并不会告知上位机当前工作状态 如需配置曝光等参数,须在触发采集数据之前