/************************************************************************************* Copyright : XianZhisensorTechnologiesCo.,Ltd File Name : gige_camera.h Description: Privide Definition of class Author : Yaming Wang Version : 1.0 Data : 2019-11-3 History : *************************************************************************************/ #ifndef DKAM_GIGE_CAMERA_H #define DKAM_GIGE_CAMERA_H #include "dkam_log.h" #include "dkam_base_type.h" #include "dkam_common_socket.h" #include "dkam_ftpserver.h" #include #include #include #include #include #ifdef _WIN32 #include #include #else #include #endif typedef struct { int socket_id; unsigned int payload_size; unsigned int width; unsigned int height; RoiPoint roi; unsigned int pixel_length; unsigned int pixel_format; unsigned int pack_num; unsigned int cloud_unit; }DataStreamPrivateInfo; typedef struct { RecvDataBuff recv_data_buff[3];//暂存区buffer RecvDataBuff *read_position[3]; //指向暂存区buffer的读指针 RecvDataBuff *write_position[3]; // 指向暂存区buffer的写指针 }DataStreamBufferInfo; class GigeStream; extern char* sdk_version; //相机控制,接收数据类 class GigeCamera :private CommonSocket{ public: GigeCamera(); ~GigeCamera(); //获取相机的CCP状态(返回0为可连接) int GetCameraCCPStatus(DiscoveryInfo* discovery_info, int *data); //连接相机 int CameraConnect(DiscoveryInfo* discovery_info); //建立通道和com之间对应关系 int ChannalCorrespondComs(); //获取相机xml所有节点名称 int GetCameraXMLNodeNames(std::vector* node_names); //验证ip是否合法 bool IsIPAddressValid(unsigned int ip_int, unsigned int camera_mask_int); //获取节点最大值 int GetNodeMaxValue(const char* key); //获取节点最小值 int GetNodeMinValue(const char* key); //获取int节点增量 int GetNodeIncValue(const char* key); //获取相机内参 int GetCamInternelParameter(int camera_cnt, float *Kc, float *K); //获取相机外参 int GetCamExternelParameter(int camera_cnt, float *R, float *T); //图像膨胀 void PixelSwell(int *roi_output, PhotoInfo &target_data); //图像腐蚀 void PixelCorrosion(int *roi_output, PhotoInfo &target_data); //ROI映射区域坐标 void ROIMappingCoordinate(int *roi_output, PhotoInfo &target_data, RoiPoint &point_output); //ROI检索映射 void ROIPixelMapping(PhotoInfo &point_data, PhotoInfo &source_data, PhotoInfo &target_data, RoiPoint &roi_input, int *ROI_output); //写寄存器 返回写寄存器是否成功的状态码 int WriteRegister(unsigned int register_addr, int data); //保存用户配置文件 int SaveUserConfig(char* fliename); //加载用户配置文件 int LoadUserConfig(char* fliename); //获取节点类型 int GetNodeType(const char* key); //获取节点访问模式 int GetNodeAccessMode(const char* key); //设置Int类型节点值 int SetIntNodeValue(const char* key, unsigned int value); //设置Bool类型节点值 int SetBoolNodeValue(const char* key, int value); //设置Command类型节点值 int SetCommandNodeValue(const char* key); //设置Float类型节点值 int SetFloatNodeValue(const char* key, float value); //设置String类型节点值 int SetStringNodeValue(const char* key, char* value); //设置Enumeration类型节点值 int SetEnumNodeValue(const char* key, int value); //获取Int类型节点值 int GetIntNodeValue(const char* key, int* value); //获取相机节点value int GetRegisterAddr(const char* key); //读string类型的寄存器 int ReadStringRegister(const char* key, char* reg_str); //写string类型的寄存器 int WriteStringRegister(const char* key, unsigned short datasize, char* reg_str); //获取Bool类型节点值 int GetBoolNodeValue(const char* key, int* value); //获取Command类型节点值 int GetCommandNodeValue(const char* key, char* value); //获取Float类型节点值 int GetFloatNodeValue(const char* key, float* value); //获取String类型节点值 int GetStringNodeValue(const char* key, char* value); //获取Enumeration类型节点值 int GetEnumNodeValue(const char* key, int* value); //读寄存器 返回读寄存器是否成功的状态码 register_addr:寄存器地址 data:读取的寄存器的值 int ReadRegister(unsigned int register_addr, int *data); //设置相机种类 (0:红外;1:RGB) int SetCameraType(int camera_cnt); //获取相机种类 (0:红外;1:RGB) int GetCameraType(); //获取相机的宽 int GetCameraWidth(int* width, int camera_cnt); //设置相机的宽 int SetCameraWidth(int width, int camera_cnt); //获取相机的高 int GetCameraHeight(int* height, int camera_cnt); //设置相机的高 int SetCameraHeight(int height, int camera_cnt); ////设置超时时间 int SetHeartBeatTimeout(int value); //获取超时时间 int GetHeartBeatTimeout(void); //设置相机曝光模式(1手动曝光,0自动曝光 camera_cnt:0是红外, 1是RGB) int SetAutoExposure(int status, int camera_cnt); //获取相机曝光模式 ( camera_cnt:0是红外, 1是RGB) int GetAutoExposure(int camera_cnt); //设置RGB摄像头自动曝光增益的级别(>=1 仅支持RGB摄像头) (camera_cnt:相机的摄像头0:红外摄像头 1:RGB摄像头 level:曝光增益等级) int SetCamExposureGainLevel(int camera_cnt, int level); //获取RGB摄像头自动曝光增益的级别,仅支持RGB摄像头(camera_cnt:相机的摄像头0:红外摄像头 1:RGB摄像头) int GetCamExposureGainLevel(int camera_cnt); //设置相机曝光类型int status > 0 多曝光 不能是0 int SetMutipleExposure(int status); //获取相机曝光类型 int GetMutipleExposure(void); //设置曝光时间,utimes:曝光时间: 红外镜头范围1000 - 100000um, RGB镜头范围1000 - 56000um, 默认16600,camera_cnt:0是红外, 1是RGB int SetExposureTime(int utime, int camera_cnt); //获取相机曝光次数 0是红外, 1是RGB int GetExposureTime(int camera_cnt); //设置多曝光模式 0:等差,1:等比 int SetMultiExpoMode(int mode); //获取多曝光模式 int GetMultiExpoMode(); //设置多曝光起点,value 范围:0-100000 int SetMultiExpoMin(int value); //获取多曝光起点 int GetMultiExpoMin(); //设置多曝光终点,value 范围:0-100000 int SetMultiExpoMax(int value); //获取多曝光终点 int GetMultiExpoMax(); //设置增益 model: 1 模拟增益量 2 数据增益量 value: 增益值 times:缺省参数,缺省为1, 第二次增益times = 2 camera_cnt:0是红外, 1是RGB int SetGain(int mode, int value, int camera_cnt); //获取相机增益值 mode: 1 模拟增益量 2 数字增益量 camera_cnt:0是红外, 1是RGB int GetGain(int mode, int camera_cnt); //设置相机触发模式mode: 0 连拍模式 1 触发模式 int SetTriggerMode(int mode); //设置相机触发模式信号来源: 0 软触发 1 硬触发 int SetTriggerSource(int sourcetype); //设置相机RGB触发模式mode: 0 连拍模式 1 触发模式 int SetRGBTriggerMode(int mode); //设置相机触发模式下的触发帧数 int SetTriggerCount(); //获取相机触发模式下的触发帧数 int GetTriggerCount(); //设置相机RGB触发模式下的触发帧数 int SetRGBTriggerCount(); //设置ROI channel_index :数据流通道索引 int SetRoi(int channel_index, int size_x, int size_y, int offset_x, int offset_y); //开启数据流通道 channel_index :数据流通道索引 int StreamOn(unsigned short channel_index, GigeStream** gigestream); // 设置激光模型 1:line, 0:plane int SetLaserMode(int mode); // 获取激光模型 int GetLaserMode(); //设置点云后处理模型 int SetPointCloudPostProcessMode(int mode); //获取点云后处理模型 int GetPointCloudPostProcessMode(); //设置点云增益值,取值范围:0-30,只有当点云自动增益等级为0时才可以设置该值 int SetPointCloudThresholdValue(int value); //获取点云增益值 int GetPointCloudThresholdValue(int* value); //设置点云自动增益等级: 0-20 int SetPointCloudThresholdLevel(int level); //获取点云自动增益等级 int GetPointCloudThresholdLevel(int* level); // 获取xml buffer size int GetXMLBufferSize(int* size); //获取xml buffer int GetXMLBuffer(char* buffer); //开启或关闭时间戳同步status: 0 关闭时间戳同步 1 开启时间戳同步 int SetTimestamp(int status); //获取时间戳是否开启 int GetTimestamp(); //获取PTPD状态码 int GetTimestampStatus(); //控制锁存时间戳 int SetTimestampControlLatch(); //获取时间戳 unsigned long long GetTimestampValue(); //获取时间戳频率 unsigned long long GetTimestampTickFrequency(); //开始接受数据 int AcquisitionStart(void); //停止接受数据 int AcquisitionStop(void); //关闭数据流通道 int StreamOff(unsigned short channel_index, GigeStream* gigestream); //相机断开连接 int CameraDisconnect(); //保存xml到本地 int SaveXmlToLocal(std::string pathname); //点云从char *转成float * void Convert3DPointFromCharToFloat(PhotoInfo &raw_data, float* output); //rawdata转RGB888图,输出的数据仍存放在PhotoInfo结构体的pixel中 int RawdataToRgb888(PhotoInfo &rgb_data); //点云滤波(基于空间密度的点云去噪) void FilterPointCloud(PhotoInfo &raw_data, double level); //空间滤波(基于空间网格的点云去噪) 20220225: 弃用, FilterPointCloud为该API的升级版 int SpatialFilterPointcloud(PhotoInfo &raw_data, int Area_PointCloudCount); //获取点云的X平面数据 int GetCloudPlaneX(PhotoInfo &raw_data, short *imagedata); //获取点云的Y平面数据 int GetCloudPlaneY(PhotoInfo &raw_data, short *imagedata); //获取点云的Z平面数据 int GetCloudPlaneZ(PhotoInfo &raw_data, short *imagedata); //保存点云某个平面数据 int SaveCloudPlane(PhotoInfo &raw_data, short *imagedata, char* path_name); //保存点云 to pcd 格式 int SavePointCloudToPcd(PhotoInfo &raw_data, char* path_name); //保存点云 to txt 格式 int SavePointCloudToTxt(PhotoInfo &raw_data, char* path_name); //保存点云 to ply 格式 int SavePointCloudToPly(PhotoInfo &raw_data, char* path_name); //保存BMP图片 int SaveToBMP(PhotoInfo &data, char *path_name); //保存点云深度图 to png int SaveDepthToPng(PhotoInfo &raw_data, char* path_name); //点云与图片融合(image_data:图片数据, raw_data:点云数据, image_cloud点云图片融合后的数据, is_filter是否进行滤波,默认滤波) int FusionImageTo3D(PhotoInfo &image_data, PhotoInfo &raw_data, float * image_cloud); //点云RGB进行融合(以RGB为标准重排点云,重排后的点云index对应无畸变的rgb图像) int Fusion3DToRGBWithOutDistortion(PhotoInfo& rgb_data, PhotoInfo& raw_data, PhotoInfo& xyz); //保存与图片融合后的点云txt int SavePointCloudWithImageToTxt(PhotoInfo &raw_data, float * image_cloud, char *path_name); //保存与图片融合后的点云Ply int SavePointCloudWithImageToPly(PhotoInfo &raw_data, float * image_cloud, char *path_name); //保存与图片融合后的点云Pcd int SavePointCloudWithImageToPcd(PhotoInfo &raw_data, float * image_cloud, char *path_name); //相机固件的版本号 char* CameraVerion(DiscoveryInfo discovery_info); //SDK的版本号 char* SDKVersion(); //点云RGB进行融合(以RGB为标准重排点云) int Fusion3DToRGB(PhotoInfo &rgb_data, PhotoInfo &raw_data, PhotoInfo &xyz); //固件升级 int FirmwareUpgrade(DiscoveryInfo discovery_info, const char *localfilename); //内核升级 int KernelUpgrade(DiscoveryInfo discovery_info, const char* localfilename); //获取下位机日志 int DownloadCameraLog(DiscoveryInfo discovery_info, const char* path, const char* name); //获取下位机日志目录 int CameraLogList(DiscoveryInfo discovery_info, std::vector* filename_s, int* len); //根据roi对数据进行裁剪,可以传入rgb和gray数据 int ImageRoiCrop(PhotoInfo& source_data, RoiPoint roi, PhotoInfo& target_data); //获取相机盖状态,此接口只对特定型号相机适用, 0:相机盖关闭,1:相机盖打开, 其他:查看错误码 int GetCameraCoverStatus(int* status); //打开相机盖,此接口只对特定型号相机适用 int TurnOnCameraCover(); //关闭相机盖,此接口只对特定型号相机适用 int TurnOffCameraCover(); // 设置激光器正常/关闭接口,1:关闭,0:正常,默认是正常状态 int SetLaserStatus(int status); // 获取激光器正常/关闭接口,1:关闭,0:正常,返回值,0:成功,其他查看错误码 int GetLaserStatus(int *status); private: #ifdef _WIN32 static unsigned int _stdcall HeartBeat(void* arg); #else static void* HeartBeat(void* arg); #endif //读内存 int ReadMem(unsigned int mem_addr, unsigned short count, char* recv_buf); //写内存 int WriteMem(unsigned int mem_addr, unsigned short count, char* recv_buf); //获取相机xml配置文件 int GetXMLfromCamera(); ////获取节点int类型的属性值 //int GetNodeProperty(const char* key, char *property); //协商数据流包大小 int GetPacketSize(); //YUYV转RGB888图,输出的数据仍存放在PhotoInfo结构体的pixel中 int YuyvToRgb888(PhotoInfo &rgb_data); //JPEG转RGB888图,输出的数据仍存放在PhotoInfo结构体的pixel中 int JpegToRgb888(PhotoInfo &rgb_data); //BayerRG8转RGB888图,输出的数据仍存放在PhotoInfo结构体的pixel中 int BayerRG8ToRgb888(PhotoInfo &rgb_data); //获取点云的某个平面数据 int GetCloudPlane(PhotoInfo &raw_data, short *imagedata, int plane); //保存红外图 to bmp 格式 int SaveGrayImageToBmp(PhotoInfo &gray_data, char *path_name); //保存rgb图 (RGB888) int SaveRgb888ToBmp(PhotoInfo &rgb_data, char* path_name); //保存rgb图 (RGB565) int SaveRgb565ToBmp(PhotoInfo &rgb_data, char* path_name); //保存rgb图(YUYV) int SaveYuyvRgbToBmp(PhotoInfo &rgb_data, char* path_name); int SaveBayerRG8ToBmp(PhotoInfo &rgb_data, char* path_name); int SaveJpegDataToJpeg(PhotoInfo &rgb_data, char* path_name); //清空socket void flush_socket_buffer(int skt); char *CameraIP(unsigned int Camera_IP); private: #ifdef _WIN32 //读写寄存器信号量 HANDLE rw_reg_sem = NULL; //心跳线程线程句柄 HANDLE ccp_thread_id = NULL; #else //读写寄存器信号量 sem_t rw_reg_sem; //心跳线程线程ID pthread_t ccp_thread_id = 0; #endif unsigned short req_id_; int camera_num_; int gvcp_socket_id_; int ccp_flag_; //保存相机配置文件xml char* xml_buffer_; //相机配置文件名 std::string xml_name_; //相机配置文件xml的后缀: xml or zip std::string xml_extension_; //相机配置文件xml的文件大小 int xml_size_; //PC端MTU int mtu_; //流通道索引 //unsigned short stream_channel_index_; //接收数据流包大小 int pack_size_; //包大小 //心跳超时时间 int heart_beat_timeout_; //记录主机和客户端信息 InstanceDevice device_info_; cameralog logfile; std::vector cam_para; //通道和cmos对应关系 int* streamList; int* comsList; int streamSize; int comsSize; char *camera_ip_; FtpServer ftpserver; public: void *node_map; void *Register_Data; }; #endif //!DKAM_GIGE_CAMERA_H