GrabBag/Module/BinocularMarkReceiver/Inc/IBinocularMarkReceiver.h
2025-12-20 16:18:12 +08:00

245 lines
7.4 KiB
C++
Raw Permalink 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.

#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