GrabBag/Module/BinocularMarkReceiver/Inc/IBinocularMarkReceiver.h

245 lines
7.2 KiB
C
Raw Normal View History

2026-03-28 10:49:55 +08:00
#ifndef IBINOCULARMARKRECEIVER_H
#define IBINOCULARMARKRECEIVER_H
#include <functional>
#include <vector>
#include <string>
#include <cstdint>
// 导出宏定义
#ifdef _WIN32
# ifdef BINOCULARMARKRECEIVER_LIBRARY
# define BINOCULARMARKRECEIVER_EXPORT __declspec(dllexport)
# else
# define BINOCULARMARKRECEIVER_EXPORT __declspec(dllimport)
# endif
#else
# define BINOCULARMARKRECEIVER_EXPORT __attribute__((visibility("default")))
#endif
/**
* @brief 通用 Mark 3D 数据结构
* 不依赖具体算法库的 Mark 数据定义
*/
struct VrMark3D
{
int markID; // Mark ID
double x; // X 坐标
double y; // Y 坐标
double z; // Z 坐标
VrMark3D() : markID(-1), x(0.0), y(0.0), z(0.0) {}
VrMark3D(int id, double _x, double _y, double _z)
: markID(id), x(_x), y(_y), z(_z) {}
};
/**
* @brief 事件类型枚举
*/
enum class ReceiverEventType
{
UNKNOWN, // 未知事件
CONNECTED, // 已连接
DISCONNECTED, // 已断开
CONNECTION_ERROR, // 连接错误
HEARTBEAT_TIMEOUT // 心跳超时
};
/**
* @brief 相机选择枚举
*/
enum class SVrCameraEnum
{
LEFT, // 左相机
RIGHT, // 右相机
BOTH // 双相机
};
/**
* @brief 双目Mark数据接收器接口
* 用于从BinocularMarkApp接收3D Mark检测结果
*/
class BINOCULARMARKRECEIVER_EXPORT IBinocularMarkReceiver
{
public:
virtual ~IBinocularMarkReceiver() = default;
/**
* @brief 单次检测结果结构
*/
struct SingleDetectionResult {
std::vector<VrMark3D> marks; // 检测到的3D标记列表
std::string leftImageBase64; // 左相机图像(Base64编码)
std::string rightImageBase64; // 右相机图像(Base64编码)
int64_t timestamp; // 时间戳
int errorCode; // 错误码(0表示成功)
};
/**
* @brief 图像数据结构
*/
struct ImageData {
std::string leftImageBase64; // 左相机图像(Base64编码)
std::string rightImageBase64; // 右相机图像(Base64编码)
int64_t timestamp; // 时间戳
};
/**
* @brief 相机信息结构
*/
struct CameraInfo {
std::string serialNumber; // 相机序列号
std::string modelName; // 相机型号
std::string displayName; // 显示名称
double exposureTime; // 当前曝光时间
double gain; // 当前增益
};
/**
* @brief Mark结果回调函数类型(持续工作模式)
* @param marks 检测到的3D标记列表
* @param timestamp 时间戳
* @param errorCode 错误码(0表示成功)
*/
using MarkResultCallback = std::function<void(const std::vector<VrMark3D>& marks, int64_t timestamp, int errorCode)>;
/**
* @brief 图像回调函数类型(持续图像流模式)
* @param leftImageBase64 左相机图像(Base64编码)
* @param rightImageBase64 右相机图像(Base64编码)
* @param timestamp 时间戳
*/
using ImageCallback = std::function<void(const std::string& leftImageBase64, const std::string& rightImageBase64, int64_t timestamp)>;
/**
* @brief 事件回调函数类型
* @param eventType 事件类型
* @param errorMsg 错误消息(可选)
*/
using EventCallback = std::function<void(ReceiverEventType eventType, const std::string& errorMsg)>;
/**
* @brief 启动TCP客户端并连接到服务器
* @param serverIp 服务器IP地址
* @param serverPort 服务器端口
* @return 0-成功,其他-失败
*/
virtual int Connect(const std::string& serverIp, uint16_t serverPort) = 0;
/**
* @brief 断开连接
* @return 0-成功,其他-失败
*/
virtual int Disconnect() = 0;
/**
* @brief 检查是否已连接
* @return true-已连接,false-未连接
*/
virtual bool IsConnected() const = 0;
/**
* @brief 获取相机信息(同步请求)
* @param target 相机目标(左/右)
* @param timeoutMs 超时时间(毫秒),默认3000ms
* @return 相机信息结构体
*/
virtual CameraInfo GetCameraInfo(SVrCameraEnum target, int timeoutMs = 3000) = 0;
/**
* @brief 获取标定矩阵(同步请求)
* @param timeoutMs 超时时间(毫秒),默认3000ms
* @return 标定矩阵XML字符串
*/
virtual std::string GetCalibrationMatrix(int timeoutMs = 3000) = 0;
/**
* @brief 设置标定矩阵(发送标定文件内容到服务端)
* @param calibrationXml 标定文件XML内容
* @return 0-成功,其他-失败
*/
virtual int SetCalibrationMatrix(const std::string& calibrationXml) = 0;
/**
* @brief 设置曝光时间
* @param target 相机目标(左/右/双)
* @param exposureTime 曝光时间
* @return 0-成功,其他-失败
*/
virtual int SetExposureTime(SVrCameraEnum target, double exposureTime) = 0;
/**
* @brief 设置增益
* @param target 相机目标(左/右/双)
* @param gain 增益
* @return 0-成功,其他-失败
*/
virtual int SetGain(SVrCameraEnum target, double gain) = 0;
/**
* @brief 请求单次检测(同步返回图像和Mark结果)
* @param timeoutMs 超时时间(毫秒),默认5000ms
* @return 检测结果结构体
*/
virtual SingleDetectionResult RequestSingleDetection(int timeoutMs = 5000) = 0;
/**
* @brief 请求获取单次图像(同步返回)
* @param timeoutMs 超时时间(毫秒),默认5000ms
* @return 图像数据结构体
*/
virtual ImageData RequestSingleImage(int timeoutMs = 5000) = 0;
/**
* @brief 开始持续工作(持续检测并回调结果)
* @return 0-成功,其他-失败
*/
virtual int StartWork() = 0;
/**
* @brief 停止持续工作
* @return 0-成功,其他-失败
*/
virtual int StopWork() = 0;
/**
* @brief 开始持续图像流(持续接收图像并回调)
* @return 0-成功,其他-失败
*/
virtual int StartCapture() = 0;
/**
* @brief 停止持续图像流
* @return 0-成功,其他-失败
*/
virtual int StopCapture() = 0;
/**
* @brief 设置Mark结果回调(持续工作模式使用)
* @param callback 回调函数
*/
virtual void SetMarkResultCallback(MarkResultCallback callback) = 0;
/**
* @brief 设置图像回调(持续图像流模式使用)
* @param callback 回调函数
*/
virtual void SetImageCallback(ImageCallback callback) = 0;
/**
* @brief 设置事件回调
* @param callback 回调函数
*/
virtual void SetEventCallback(EventCallback callback) = 0;
/**
* @brief 创建BinocularMarkReceiver实例
* @param ppReceiver 接收器实例指针
* @return 0-成功,其他-失败
*/
static int CreateInstance(IBinocularMarkReceiver** ppReceiver);
};
#endif // IBINOCULARMARKRECEIVER_H