|
|
|
@ -24,6 +24,73 @@
|
|
|
|
#include "Arith_FrontSolver.h"
|
|
|
|
#include "Arith_FrontSolver.h"
|
|
|
|
#include "Arith_BlendMap.h"
|
|
|
|
#include "Arith_BlendMap.h"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 水平扫描方向
|
|
|
|
|
|
|
|
enum FSCAN_DIR
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
LEFT,
|
|
|
|
|
|
|
|
RIGHT
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class AngleDirection {
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
|
|
|
AngleDirection(size_t confirmCount = 3, double thr = 0.05)
|
|
|
|
|
|
|
|
: lastAngle(-1), lastConfirmedDir(0),
|
|
|
|
|
|
|
|
confirmCount(confirmCount), threshold(thr) {
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 输入新角度,返回:true=方向变化,false=方向未变
|
|
|
|
|
|
|
|
bool update(double angle) {
|
|
|
|
|
|
|
|
bool changed = false;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (std::isnan(lastAngle)) { // 第一次输入
|
|
|
|
|
|
|
|
lastAngle = angle;
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 计算差值,处理跨越 0/360 的情况
|
|
|
|
|
|
|
|
double diff = angle - lastAngle;
|
|
|
|
|
|
|
|
if (diff > 180) diff -= 360;
|
|
|
|
|
|
|
|
if (diff < -180) diff += 360;
|
|
|
|
|
|
|
|
lastAngle = angle;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 小于阈值认为无效
|
|
|
|
|
|
|
|
if (std::fabs(diff) < threshold) return false;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int dir = (diff > 0) ? 1 : -1;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
printf("dir:%d\n", dir);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
diffs.push_back(dir);
|
|
|
|
|
|
|
|
if (diffs.size() > confirmCount) diffs.pop_front();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 检查是否连续 confirmCount 个相同方向
|
|
|
|
|
|
|
|
if (diffs.size() == confirmCount) {
|
|
|
|
|
|
|
|
bool allSame = true;
|
|
|
|
|
|
|
|
for (size_t i = 1; i < diffs.size(); i++) {
|
|
|
|
|
|
|
|
if (diffs[i] != diffs[0]) {
|
|
|
|
|
|
|
|
allSame = false;
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (allSame) {
|
|
|
|
|
|
|
|
if (lastConfirmedDir != 0 && diffs[0] != lastConfirmedDir) {
|
|
|
|
|
|
|
|
changed = true; // 确认方向变化
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
lastConfirmedDir = diffs[0];
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return changed;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
|
|
|
double lastAngle; // 上一帧角度
|
|
|
|
|
|
|
|
int lastConfirmedDir; // 已确认的方向
|
|
|
|
|
|
|
|
std::deque<int> diffs; // 存最近差值符号
|
|
|
|
|
|
|
|
size_t confirmCount; // 连续确认帧数
|
|
|
|
|
|
|
|
double threshold; // 抖动阈值
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
class FrontStitch:public API_FrontStitch
|
|
|
|
class FrontStitch:public API_FrontStitch
|
|
|
|
{
|
|
|
|
{
|
|
|
|
@ -43,6 +110,9 @@ public:
|
|
|
|
// 获取全景图
|
|
|
|
// 获取全景图
|
|
|
|
GD_VIDEO_FRAME_S ExportPanAddr();
|
|
|
|
GD_VIDEO_FRAME_S ExportPanAddr();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 重置地面起始点
|
|
|
|
|
|
|
|
void ResetOrigin(FrameInfo para);
|
|
|
|
|
|
|
|
|
|
|
|
// 像方转经纬高
|
|
|
|
// 像方转经纬高
|
|
|
|
PointBLH getBLHFromPanUV(POINT32F pt);
|
|
|
|
PointBLH getBLHFromPanUV(POINT32F pt);
|
|
|
|
|
|
|
|
|
|
|
|
@ -83,6 +153,9 @@ private:
|
|
|
|
FPanInfo _panPara;//全景配置
|
|
|
|
FPanInfo _panPara;//全景配置
|
|
|
|
cv::Mat _panImage;
|
|
|
|
cv::Mat _panImage;
|
|
|
|
cv::Mat _panMask; //覆盖区域遮罩
|
|
|
|
cv::Mat _panMask; //覆盖区域遮罩
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
AngleDirection AglMonitor;
|
|
|
|
|
|
|
|
|
|
|
|
// device mem
|
|
|
|
// device mem
|
|
|
|
private:
|
|
|
|
private:
|
|
|
|
cuda_Mem _cuda_mem;
|
|
|
|
cuda_Mem _cuda_mem;
|
|
|
|
|