feat: v0.1.0更新

This commit is contained in:
2026-01-14 18:07:26 +08:00
commit efd8a7cc20
55 changed files with 6200 additions and 0 deletions

385
include/dkam_gige_camera.h Normal file
View File

@@ -0,0 +1,385 @@
/*************************************************************************************
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