using BetterGenshinImpact.GameTask.Model.Area;
using OpenCvSharp;
using System;
using System.Diagnostics;
using System.Drawing;
using BetterGenshinImpact.GameTask.Common.Element.Assets;
using BetterGenshinImpact.GameTask.Common.Map.Camera;
using Point = OpenCvSharp.Point;
namespace BetterGenshinImpact.GameTask.Common.Map;
public class CameraOrientation
{
private static readonly CameraOrientationFromLimint _coV2 = new();
///
/// 计算当前小地图摄像机朝向的角度
///
/// 完整游戏截图彩色
/// 角度
public static float Compute(Mat mat)
{
var mimiMap = new Mat(mat, MapAssets.Instance.MimiMapRect);
return ComputeMiniMap(mimiMap);
}
///
/// 计算当前小地图摄像机朝向的角度
///
/// 小地图彩色图
/// 角度
public static float ComputeMiniMap(Mat mat)
{
var (angle, confidence) = _coV2.PredictRotationWithConfidence(mat);
if (confidence < 0.3)
{
Debug.WriteLine($"置信度过低, {confidence}<0.3, 不可靠视角 {angle}");
Cv2.CvtColor(mat, mat, ColorConversionCodes.BGR2GRAY);
return CameraOrientationFromGia.ComputeMiniMap(mat);
}
return angle;
}
public static void DrawDirection(ImageRegion region, double angle, string name = "camera", Pen? pen = null)
{
// 绘图
var scale = TaskContext.Instance().SystemInfo.AssetScale;
const int r = 100;
var center = new Point(168 * scale, 125 * scale); // 地图中心点 后续建议调整
var x1 = center.X + r * Math.Cos(angle * Math.PI / 180);
var y1 = center.Y + r * Math.Sin(angle * Math.PI / 180);
// var line = new LineDrawable(center, new Point(x1, y1))
// {
// Pen = new Pen(Color.Yellow, 1)
// };
// VisionContext.Instance().DrawContent.PutLine("camera", line);
pen ??= new Pen(Color.Yellow, 1);
region.DrawLine(center.X, center.Y, (int)x1, (int)y1, name, pen);
}
}