feat: v0.1.0更新
This commit is contained in:
385
include/dkam_gige_camera.h
Normal file
385
include/dkam_gige_camera.h
Normal 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:红外;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
|
||||
Reference in New Issue
Block a user