#ifndef IEPICEYEDEVICE_H #define IEPICEYEDEVICE_H #include #include #include #include // 设备信息结构 struct EpicEyeDeviceInfo { std::string serialNumber; // 序列号 std::string ipAddress; // IP地址 std::string modelName; // 型号名称 std::string alias; // 别名 unsigned int width; // 图像宽度 unsigned int height; // 图像高度 }; // 点云数据结构 struct PointCloudData { float* pData; // 点云数据指针 (x, y, z 交替存储) unsigned int width; // 点云宽度 unsigned int height; // 点云高度 unsigned int pointCount; // 点数 (width * height) std::string frameID; // 帧ID }; // 2D图像数据结构 struct ImageData2D { unsigned char* pData; // 图像数据指针 unsigned int width; // 图像宽度 unsigned int height; // 图像高度 unsigned int dataSize; // 数据大小 int pixelByteSize; // 像素字节大小 std::string frameID; // 帧ID }; // 深度图数据结构 struct DepthData { float* pData; // 深度数据指针 unsigned int width; // 深度图宽度 unsigned int height; // 深度图高度 unsigned int dataSize; // 数据大小 std::string frameID; // 帧ID }; // 相机内参结构 struct CameraIntrinsics { std::vector cameraMatrix; // 相机矩阵 3x3 std::vector distortion; // 畸变参数 }; /** * @brief IEpicEyeDevice 接口类 * 封装 EpicEye SDK,提供 3D 相机点云采集的 C++ 接口 */ class IEpicEyeDevice { public: virtual ~IEpicEyeDevice() = default; /** * @brief 创建设备对象 * @param ppDevice 设备对象指针 * @return 0-成功,其他-失败 */ static int CreateObject(IEpicEyeDevice** ppDevice); /** * @brief 获取 SDK 版本 * @param version SDK版本字符串 * @return 0-成功,其他-失败 */ virtual int GetSDKVersion(std::string& version) = 0; /** * @brief 搜索网络中的 EpicEye 相机 * @param deviceList 返回的设备列表 * @return 0-成功,其他-失败 */ virtual int SearchCameras(std::vector& deviceList) = 0; /** * @brief 通过 IP 地址连接相机 * @param ipAddress 相机 IP 地址 * @return 0-成功,其他-失败 */ virtual int Connect(const std::string& ipAddress) = 0; /** * @brief 断开相机连接 * @return 0-成功,其他-失败 */ virtual int Disconnect() = 0; /** * @brief 检查是否已连接 * @return true-已连接,false-未连接 */ virtual bool IsConnected() = 0; /** * @brief 获取已连接相机的设备信息 * @param deviceInfo 设备信息结构 * @return 0-成功,其他-失败 */ virtual int GetDeviceInfo(EpicEyeDeviceInfo& deviceInfo) = 0; /** * @brief 触发拍摄一帧(包含点云和2D图像) * @param frameID 返回的帧ID * @param withPointCloud 是否包含点云数据(默认true) * @return 0-成功,其他-失败 */ virtual int TriggerCapture(std::string& frameID, bool withPointCloud = true) = 0; /** * @brief 获取点云数据 * @param frameID 帧ID(由 TriggerCapture 返回) * @param pointCloud 点云数据结构 * @return 0-成功,其他-失败 * @note 点云数据内存需要调用者释放 */ virtual int GetPointCloud(const std::string& frameID, PointCloudData& pointCloud) = 0; /** * @brief 获取2D图像数据 * @param frameID 帧ID(由 TriggerCapture 返回) * @param image 图像数据结构 * @return 0-成功,其他-失败 * @note 图像数据内存需要调用者释放 */ virtual int GetImage(const std::string& frameID, ImageData2D& image) = 0; /** * @brief 获取深度图数据 * @param frameID 帧ID(由 TriggerCapture 返回) * @param depth 深度图数据结构 * @return 0-成功,其他-失败 * @note 深度图数据内存需要调用者释放 */ virtual int GetDepth(const std::string& frameID, DepthData& depth) = 0; /** * @brief 一次性获取点云数据(触发+获取) * @param pointCloud 点云数据结构 * @param timeout 超时时间(毫秒),默认5000ms * @return 0-成功,其他-失败 * @note 这是一个便捷方法,内部会自动调用 TriggerCapture 和 GetPointCloud */ virtual int CapturePointCloud(PointCloudData& pointCloud, unsigned int timeout = 5000) = 0; /** * @brief 一次性获取2D图像(触发+获取) * @param image 图像数据结构 * @param timeout 超时时间(毫秒),默认5000ms * @return 0-成功,其他-失败 */ virtual int CaptureImage(ImageData2D& image, unsigned int timeout = 5000) = 0; /** * @brief 获取相机内参 * @param intrinsics 相机内参结构 * @return 0-成功,其他-失败 */ virtual int GetCameraIntrinsics(CameraIntrinsics& intrinsics) = 0; /** * @brief 获取相机配置(JSON格式) * @param configJson 配置JSON字符串 * @return 0-成功,其他-失败 */ virtual int GetConfig(std::string& configJson) = 0; /** * @brief 设置相机配置(JSON格式) * @param configJson 配置JSON字符串 * @return 0-成功,其他-失败 */ virtual int SetConfig(const std::string& configJson) = 0; /** * @brief 获取图像宽度 * @param width 图像宽度 * @return 0-成功,其他-失败 */ virtual int GetWidth(unsigned int& width) = 0; /** * @brief 获取图像高度 * @param height 图像高度 * @return 0-成功,其他-失败 */ virtual int GetHeight(unsigned int& height) = 0; }; #endif // IEPICEYEDEVICE_H