386 lines
15 KiB
C++
386 lines
15 KiB
C++
/*************************************************************************************
|
||
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 <iostream>
|
||
#include <stdbool.h>
|
||
#include <vector>
|
||
#include <cstring>
|
||
#include <map>
|
||
|
||
#ifdef _WIN32
|
||
#include<windows.h>
|
||
#include <WS2tcpip.h>
|
||
#else
|
||
#include <semaphore.h>
|
||
#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<std::string>* 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<std::string>* 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<CameraParameter> 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
|