Files
d330viewer/include/dkam_gige_camera.h
2026-01-14 18:07:26 +08:00

386 lines
15 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*************************************************************************************
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红外1RGB)
int SetCameraType(int camera_cnt);
//获取相机种类 (0红外1RGB)
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, 默认16600camera_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);
// 设置激光模型 1line 0plane
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