LASAPlatform/OpenAuth.App/ServiceApp/Algo/DaHuaAiApp.cs

413 lines
19 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using Infrastructure;
using Infrastructure.CloudSdk.minio;
using Infrastructure.Extensions;
using Minio;
using Newtonsoft.Json;
using OpenAuth.App.BaseApp.Base;
using OpenAuth.App.Interface;
using OpenAuth.App.ServiceApp.Algo.Request;
using OpenAuth.App.ServiceApp.Algo.Response;
using OpenAuth.Repository;
using OpenAuth.Repository.Domain;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.Linq;
using System.Net;
using System.Text;
using System.Text.Json.Nodes;
using System.Threading.Tasks;
namespace OpenAuth.App.ServiceApp.Algo
{
public class DaHuaAiApp : SqlSugarBaseApp<LasaAlgorithmsRepository, SugarDbContext>
{
public MinioService _minioService;
public DaHuaAiApp(ISugarUnitOfWork<SugarDbContext> unitWork, MinioService minioService,
ISimpleClient<LasaAlgorithmsRepository> repository, IAuth auth) : base(unitWork, repository, auth)
{
_minioService = minioService;
}
#region 大华算法
//分析两次航线图片
public async Task<Response<List<dynamic>>> BehaviorAlarm(string firstId, string secondId, string cdid)
{
using (var db = UnitWork.CreateContext())
{
var imageList1 = await db.LasaMediaFile.AsQueryable().Where(r => r.TaskId == firstId && r.AbsoluteAltitude != 0 && r.AbsoluteAltitude != null).OrderBy(r => r.CreateTime).ToListAsync();
var imageList2 = await db.LasaMediaFile.AsQueryable().Where(r => r.TaskId == secondId && r.AbsoluteAltitude != 0 && r.AbsoluteAltitude != null).OrderBy(r => r.CreateTime).ToListAsync();
//var imageList1 = await db.LasaMediaFile.AsQueryable().Where(r => r.Id == firstId && r.AbsoluteAltitude != 0 && r.AbsoluteAltitude != null).ToListAsync();
//var imageList2 = await db.LasaMediaFile.AsQueryable().Where(r => r.Id == secondId && r.AbsoluteAltitude != 0 && r.AbsoluteAltitude != null).ToListAsync();
List<dynamic> dataList = new List<dynamic>();
if (imageList1.Count() != imageList2.Count())
{
throw new Exception("任务照片数量不对应,请重新选择任务");
}
for (int i = 0; i < imageList1.Count; i++)
{
dataList.Add(new
{
@event = "event.capturePic",
uid = "1",
channelCode = "sdhc04",
recordId = "kQUXlb1Y8oDgCpZSo7l2yG175617335006157587",
sourceId = "kQUXlb1Y8oDgCpZSo7l2yG175617335006157587",
taskSource = 1,
taskId = "8ab0e1e213234a848e20d0d335559786",
capTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(),
taskTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(),
cdid = cdid,
imageInfo = new
{
imgSize = 1667235,
imgWidth = 4032,
imgHeight = 3024
},
imageInfoList = new[]
{
new {
imgUrl = "http://175.27.168.120:6013/test/"+imageList1[i].ObjectKey,
imgSize = imageList1[i].Size,
imgWidth = imageList1[i].Width,
imgHeight = imageList1[i].Height,
imgType = 0,
longitude = imageList1[i].Lng,
absAltitude = imageList1[i].AbsoluteAltitude,
latitude = imageList1[i].Lat,
zoom = imageList1[i].DigitalZoomRatio,
yaw = imageList1[i].GimbalYawDegree,
pitch = imageList1[i].GimbalPitchDegree,
roll = imageList1[i].GimbalRollDegree,
focalLength = imageList1[i].FocalLength
},
new {
imgUrl = "http://175.27.168.120:6013/test/"+imageList2[i].ObjectKey,
imgSize = imageList2[i].Size,
imgWidth = imageList2[i].Width,
imgHeight = imageList2[i].Height,
imgType = 1,
longitude =imageList2[i].Lng,
absAltitude = imageList2[i].AbsoluteAltitude,//拍摄绝对高度
latitude = imageList2[i].Lat,
zoom = imageList2[i].DigitalZoomRatio,//放大倍率
yaw =imageList2[i].GimbalYawDegree,//偏航角?
pitch = imageList2[i].GimbalPitchDegree,//滚角?
roll = imageList2[i].GimbalRollDegree,
focalLength = imageList2[i].FocalLength//焦距
}
}
});
}
return new Response<List<dynamic>>
{
Result = dataList,
Message = "获取数据成功"
};
}
}
public async Task<Response<bool>> AddDaHuaImg(string info)
{
Console.WriteLine(info);
using (var db = UnitWork.CreateContext())
{
var data = JsonConvert.DeserializeObject<dynamic>(info);
string cdid = data.cdid.ToString();
var oldinfo = await db.LasaAiAchievement.GetFirstAsync(r => r.TaskId == cdid);
var imageList = data.imageInfoList;
string detectRegionJson = JsonConvert.SerializeObject(data.info.detectRegion);
//string detectRegionJson = "[[0, 0],[8063, 647],[8017, 7774],[552, 8033]]";
//string url = "http://123.132.248.154:6015/DroneEnforcement/2025/20250514/lQLPJyIVimQWGKnNA4PNA6Gw1D3q5gbxUvQIiumcIx4vAA_929_899.png";
var regionArray = JsonConvert.DeserializeObject<int[][]>(detectRegionJson);
if (oldinfo != null)
{
string compareGroupId = Guid.NewGuid().ToString();
int index = 0;
foreach (var item in imageList)
{
//插入详情
LasaAiAchievementDetail lasaAiAchievementDetail = new LasaAiAchievementDetail()
{
Id = Guid.NewGuid().ToString(),
Image = item.imgUrl,
AiAchievementId = oldinfo.Id,
Lng = (double?)item.longitude ?? 0.0,
Lat = (double?)item.latitude ?? 0.0,
CompareIndex = index,
GroupId = compareGroupId
};
// 如果是第二张图片 -> 画区域 + 上传
if (index == 1)
{
Console.WriteLine(item.imgUrl);
Console.WriteLine(regionArray);
var imgurlend = await DrawingImgAndUpload(item.imgUrl.ToString().Replace("\\", ""), regionArray, cdid);
lasaAiAchievementDetail.Image = imgurlend;
}
await db.LasaAiAchievementDetail.InsertAsync(lasaAiAchievementDetail);
index++;
}
}
else
{
string compareGroupId = Guid.NewGuid().ToString();
int index = 0;
LasaAiAchievement lasaAiAchievement = new LasaAiAchievement
{
Id = Guid.NewGuid().ToString(),
Title = "本地耕地破坏区域报警",
CreateTime = DateTime.Now,
AiModel = "DaHuaAi",
TaskId = cdid
};
foreach (var item in imageList)
{
//插入详情
LasaAiAchievementDetail lasaAiAchievementDetail = new LasaAiAchievementDetail()
{
Id = Guid.NewGuid().ToString(),
Image = item.imgUrl,
AiAchievementId = lasaAiAchievement.Id,
Lng = (double?)item.longitude ?? 0.0,
Lat = (double?)item.latitude ?? 0.0,
CompareIndex = index,
GroupId = compareGroupId
};
// 如果是第二张图片 -> 画区域 + 上传
if (index == 1)
{
Console.WriteLine(item.imgUrl);
Console.WriteLine(regionArray);
//var imgurlend = await DrawingImgAndUpload(item.imgUrl, regionArray);
var imgurlend = await DrawingImgAndUpload(item.imgUrl.ToString().Replace("\\", ""), regionArray, cdid);
lasaAiAchievementDetail.Image = imgurlend;
}
lasaAiAchievement.Lat = item.latitude;
lasaAiAchievement.Lng = item.longitude;
lasaAiAchievement.Cover = item.imgUrl;
await db.LasaAiAchievementDetail.InsertAsync(lasaAiAchievementDetail);
index++;
}
await db.LasaAiAchievement.InsertAsync(lasaAiAchievement);
//查询监测记录然后更新监测记录的成果id
await db.Lasa_ChangeDetection.UpdateAsync(u => new Lasa_ChangeDetection
{
AiAchievementId = lasaAiAchievement.Id
}, u => u.Id == cdid);
}
if (db.Commit())
return new Response<bool>
{
Result = true,
Message = "添加成功"
};
else
return new Response<bool>
{
Result = false,
Message = "添加失败"
};
}
}
//public async Task<string> DrawingImgAndUpload(string url, int[][] regionArray)
public async Task<string> DrawingImgAndUpload(string url, int[][] regionArray, string cdid)
{
//string url = "http://123.132.248.154:6015/DroneEnforcement/2025/20250514/lQLPJyIVimQWGKnNA4PNA6Gw1D3q5gbxUvQIiumcIx4vAA_929_899.png";
// detectRegion JSON可以直接替换成你的接口返回数据
//string detectRegionJson = "[[0, 0],[8063, 647],[8017, 7774],[552, 8033]]";
//var regionArray = JsonConvert.DeserializeObject<int[][]>(detectRegionJson);
//Console.WriteLine($"regionArray 是否为空");
//if (regionArray == null || regionArray.Length == 0)
// throw new ArgumentException("detectRegion 参数无效");
Point[] polygon = new Point[regionArray.Length];
for (int i = 0; i < regionArray.Length; i++)
{
polygon[i] = new Point(regionArray[i][0], regionArray[i][1]);
}
using (HttpClient client = new HttpClient())
{
var bytes = await client.GetByteArrayAsync(url);
using (var ms = new MemoryStream(bytes))
using (var image = Image.FromStream(ms))
using (var bmp = new Bitmap(image))
using (var g = Graphics.FromImage(bmp))
{
g.SmoothingMode = SmoothingMode.AntiAlias;
using (var pen = new Pen(Color.Red, 5))
{
g.DrawPolygon(pen, polygon);
}
using (var outputStream = new MemoryStream())
{
bmp.Save(outputStream, ImageFormat.Png);
outputStream.Position = 0;
string fileName = Path.GetFileName(new Uri(url).AbsolutePath);
// 上传到 MinIO直接传 MemoryStream
string uploadedUrl = await _minioService.UploadStreamFile(outputStream, fileName, "test", cdid);
Console.WriteLine("返回imgurl" + uploadedUrl);
return uploadedUrl;
}
}
}
}
public async void DrawingImgAsync()
{
string url = "http://123.132.248.154:6015/DroneEnforcement/2025/20250514/lQLPJyIVimQWGKnNA4PNA6Gw1D3q5gbxUvQIiumcIx4vAA_929_899.png";
string savePath = "output.png";
// detectRegion JSON可以直接替换成你的接口返回数据
string detectRegionJson = "[[0, 0],[8063, 647],[8017, 7774],[552, 8033]]";
// 解析 JSON
var regionArray = JsonConvert.DeserializeObject<int[][]>(detectRegionJson);
if (regionArray == null)
{
Console.WriteLine("解析 detectRegion 失败");
return;
}
Point[] polygon = new Point[regionArray.Length];
for (int i = 0; i < regionArray.Length; i++)
{
polygon[i] = new Point(regionArray[i][0], regionArray[i][1]);
}
using (HttpClient client = new HttpClient())
{
var bytes = await client.GetByteArrayAsync(url);
using (var ms = new System.IO.MemoryStream(bytes))
using (var image = Image.FromStream(ms))
using (var bmp = new Bitmap(image))
using (var g = Graphics.FromImage(bmp))
{
g.SmoothingMode = SmoothingMode.AntiAlias;
using (var pen = new Pen(Color.Red, 5)) // 红色边框
using (var brush = new SolidBrush(Color.FromArgb(80, Color.Blue))) // 半透明填充
{
g.FillPolygon(brush, polygon);
g.DrawPolygon(pen, polygon);
}
bmp.Save(savePath, ImageFormat.Png);
}
}
Console.WriteLine("已保存图片: " + savePath);
}
#endregion
#region 本地模型
public async Task<Response<bool>> AddImg(string taskid, string path, string aiid, dynamic drone_info, List<TagItem> tag)
{
using (var db = UnitWork.CreateContext())
{
foreach (var item in tag)
{
var info = await db.LasaAiAchievement.GetFirstAsync(r => r.TaskId == taskid && r.Tag == item.class_id.ToString());
var modelinfo = await db.LasaModelLabel.AsQueryable().Where(r => r.PId == aiid).ToListAsync();
double lat = 0.0, lng = 0.0;
if (drone_info != null)
{
//var root = JsonNode.Parse(drone_info)?.AsObject();
//lat = root?["data"]?["latitude"]?.GetValue<double>() ?? 0.0;
//lng = root?["data"]?["longitude"]?.GetValue<double>() ?? 0.0;
lat = (double?)drone_info.data?.latitude ?? 0.0;
lng = (double?)drone_info.data?.longitude ?? 0.0;
}
if (info == null)
{
LasaAiAchievement lasaAiAchievement = new LasaAiAchievement();
lasaAiAchievement.Id = Guid.NewGuid().ToString();
lasaAiAchievement.CreateTime = DateTime.Now;
lasaAiAchievement.TaskId = taskid;
lasaAiAchievement.AiModel = "yolo12x";
lasaAiAchievement.Tag = item.class_id.ToString();
lasaAiAchievement.AlgoId = aiid;
var modelid = modelinfo.Where(r => r.EnumValue == item.class_id).FirstOrDefault();
if (modelid != null)
{
lasaAiAchievement.Title = modelid.Name;
}
else
{
lasaAiAchievement.Title = "";
}
//var confidence = tag.Select(r => r.confidence).Max();
var confidence = item.confidence;
if (confidence < 0.3)
{
break;
}
lasaAiAchievement.ConfidenceLevel = (float)Math.Round(confidence, 2) * 100;
//插入详情
LasaAiAchievementDetail lasaAiAchievementDetail = new LasaAiAchievementDetail()
{
Id = Guid.NewGuid().ToString(),
Image = "http://175.27.168.120:6013/test/" + path,
AiAchievementId = lasaAiAchievement.Id,
Lat = lat,
Lng = lng
};
lasaAiAchievement.Cover = "http://175.27.168.120:6013/test/" + path;
lasaAiAchievement.Lat = (float)lat;
lasaAiAchievement.Lng = (float)lng;
await db.LasaAiAchievement.InsertAsync(lasaAiAchievement);
await db.LasaAiAchievementDetail.InsertAsync(lasaAiAchievementDetail);
}
else
{
//插入详情
LasaAiAchievementDetail lasaAiAchievementDetail = new LasaAiAchievementDetail()
{
Id = Guid.NewGuid().ToString(),
Image = "http://175.27.168.120:6013/test/" + path,
AiAchievementId = info.Id,
Lat = lat,
Lng = lng
};
await db.LasaAiAchievementDetail.InsertAsync(lasaAiAchievementDetail);
}
}
if (db.Commit())
return new Response<bool>
{
Result = true,
Message = "添加成功"
};
else
return new Response<bool>
{
Result = false,
Message = "添加失败"
};
}
}
#endregion
}
}