#ifndef _FEASTITCH_H #define _FEASTITCH_H #include "API_FeaStitch.h" #include "opencv2/opencv.hpp" #include "Arith_BATask.h" #include // 定义出界方向枚举 enum class EdgeDirection { NONE, // 未出界 LEFT, // 左边界 RIGHT, // 右边界 TOP, // 上边界 BOTTOM, // 下边界 TOP_LEFT, // 左上角 TOP_RIGHT, // 右上角 BOTTOM_LEFT,// 左下角 BOTTOM_RIGHT// 右下角 }; class FeaStitch :public API_FeaStitch { public: FeaStitch(); ~FeaStitch(); GenPanInfo Init(GD_VIDEO_FRAME_S img,FrameInfo info); // 当前帧设为拼接基准 void SetBase(cv::Mat& img, FrameInfo& info, EdgeDirection edgeDirection = EdgeDirection::NONE); SINT32 Run(GD_VIDEO_FRAME_S img, FrameInfo para); public: GD_VIDEO_FRAME_S ExportPanAddr(); cv::Mat ExportPanMat(); FeatureMatcher* _FeaMatcher;//特征匹配 private: std::vector _paraVec; // 帧参数 //std::vector _imgVec; //图像缓存 std::vector> _keypointsVec; // 特征点 std::vector _descriptorsVec; // 描述子 std::vector> _currMatrix;//当前H矩阵 int _totalFrameCnt;//处理帧计数 int _failedFrameCnt;//匹配失败计数 private: GenPanInfo _panPara;//全景图配置 cv::Mat _panImage; //全景图 // 检测图像是否接近边缘,返回出界方向 EdgeDirection isNearEdge(cv::Mat& H,cv::Size size); // 根据出界方向计算初始偏移量 void calculateInitialOffset(EdgeDirection direction, int& offsetX, int& offsetY); float calculateIOU(const cv::Mat& H1, const cv::Mat& H2, const cv::Size& imgSize); // 检查H矩阵连续性 bool checkHContinuity(const cv::Mat& H, const cv::Size& imgSize); // 检查最终H矩阵有效性 bool checkFinalHValidity(const cv::Mat& H, const cv::Size& imgSize); }; #endif