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

436 lines
20 KiB
C#
Raw Normal View History

2025-08-27 16:33:05 +08:00
using Infrastructure;
2025-09-09 17:24:03 +08:00
using Infrastructure.CloudSdk.minio;
using Infrastructure.Extensions;
using Minio;
2025-08-27 16:33:05 +08:00
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;
2025-09-09 17:24:03 +08:00
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
2025-08-27 16:33:05 +08:00
using System.Linq;
2025-09-09 17:24:03 +08:00
using System.Net;
2025-08-27 16:33:05 +08:00
using System.Text;
2025-09-02 14:06:16 +08:00
using System.Text.Json.Nodes;
2025-08-27 16:33:05 +08:00
using System.Threading.Tasks;
namespace OpenAuth.App.ServiceApp.Algo
{
public class DaHuaAiApp : SqlSugarBaseApp<LasaAlgorithmsRepository, SugarDbContext>
{
2025-09-09 17:24:03 +08:00
public MinioService _minioService;
public DaHuaAiApp(ISugarUnitOfWork<SugarDbContext> unitWork, MinioService minioService,
2025-08-27 16:33:05 +08:00
ISimpleClient<LasaAlgorithmsRepository> repository, IAuth auth) : base(unitWork, repository, auth)
{
2025-09-09 17:24:03 +08:00
_minioService = minioService;
2025-08-27 16:33:05 +08:00
}
#region 大华算法
//分析两次航线图片
2025-09-10 10:37:23 +08:00
public async Task<Response<List<dynamic>>> BehaviorAlarm(string firstId, string secondId, string cdid)
2025-08-27 16:33:05 +08:00
{
using (var db = UnitWork.CreateContext())
{
2025-09-10 16:48:58 +08:00
var imageList1 = await db.LasaMediaFile.AsQueryable().Where(r => r.TaskId == firstId && r.AbsoluteAltitude != 0 && r.AbsoluteAltitude != null).OrderBy(r => r.CreateTime).ToListAsync();
2025-09-10 14:20:14 +08:00
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();
2025-08-27 16:33:05 +08:00
List<dynamic> dataList = new List<dynamic>();
2025-09-10 16:48:58 +08:00
if (imageList1.Count() != imageList2.Count())
{
2025-09-10 16:49:09 +08:00
throw new Exception("任务照片数量不对应,请重新选择任务");
2025-09-10 16:48:58 +08:00
}
2025-08-27 16:33:05 +08:00
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(),
2025-09-10 10:37:23 +08:00
cdid = cdid,
2025-08-27 16:33:05 +08:00
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
2025-09-10 10:37:23 +08:00
2025-08-27 16:33:05 +08:00
},
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)
{
2025-09-10 13:41:50 +08:00
Console.WriteLine(info);
2025-08-27 16:33:05 +08:00
using (var db = UnitWork.CreateContext())
{
var data = JsonConvert.DeserializeObject<dynamic>(info);
2025-09-10 10:37:23 +08:00
string cdid = data.cdid.ToString();
var oldinfo = await db.LasaAiAchievement.GetFirstAsync(r => r.TaskId == cdid);
var imageList = data.imageInfoList;
2025-09-09 17:24:03 +08:00
string detectRegionJson = JsonConvert.SerializeObject(data.info.detectRegion);
2025-09-10 13:41:50 +08:00
//string detectRegionJson = "[[0, 0],[8063, 647],[8017, 7774],[552, 8033]]";
2025-09-10 14:20:14 +08:00
//string url = "http://123.132.248.154:6015/DroneEnforcement/2025/20250514/lQLPJyIVimQWGKnNA4PNA6Gw1D3q5gbxUvQIiumcIx4vAA_929_899.png";
var regionArray = JsonConvert.DeserializeObject<int[][]>(detectRegionJson);
2025-09-10 10:37:23 +08:00
if (oldinfo != null)
2025-08-27 16:33:05 +08:00
{
2025-09-10 16:10:29 +08:00
string compareGroupId = Guid.NewGuid().ToString();
2025-09-10 13:41:50 +08:00
int index = 0;
2025-09-10 10:37:23 +08:00
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,
2025-09-10 16:10:29 +08:00
CompareIndex = index,
GroupId = compareGroupId,
CompareCount = regionArray.Length
2025-09-10 16:10:29 +08:00
2025-09-10 10:37:23 +08:00
};
2025-09-10 13:41:50 +08:00
// 如果是第二张图片 -> 画区域 + 上传
if (index == 1)
{
Console.WriteLine(item.imgUrl);
Console.WriteLine(regionArray);
2025-09-10 14:20:14 +08:00
var imgurlend = await DrawingImgAndUpload(item.imgUrl.ToString().Replace("\\", ""), regionArray, cdid);
2025-09-10 13:41:50 +08:00
lasaAiAchievementDetail.Image = imgurlend;
}
2025-09-10 10:37:23 +08:00
await db.LasaAiAchievementDetail.InsertAsync(lasaAiAchievementDetail);
index++;
}
}
else
{
2025-09-10 16:10:29 +08:00
string compareGroupId = Guid.NewGuid().ToString();
2025-09-10 13:41:50 +08:00
int index = 0;
2025-09-10 10:37:23 +08:00
LasaAiAchievement lasaAiAchievement = new LasaAiAchievement
2025-08-27 16:33:05 +08:00
{
Id = Guid.NewGuid().ToString(),
2025-09-10 13:41:50 +08:00
Title = "本地耕地破坏区域报警",
2025-09-10 10:37:23 +08:00
CreateTime = DateTime.Now,
AiModel = "DaHuaAi",
TaskId = cdid
2025-08-27 16:33:05 +08:00
};
2025-09-10 10:37:23 +08:00
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,
2025-09-10 16:10:29 +08:00
CompareIndex = index,
GroupId = compareGroupId,
CompareCount = regionArray.Length
2025-09-10 10:37:23 +08:00
};
2025-09-10 13:41:50 +08:00
// 如果是第二张图片 -> 画区域 + 上传
if (index == 1)
{
Console.WriteLine(item.imgUrl);
Console.WriteLine(regionArray);
//var imgurlend = await DrawingImgAndUpload(item.imgUrl, regionArray);
2025-09-10 14:20:14 +08:00
var imgurlend = await DrawingImgAndUpload(item.imgUrl.ToString().Replace("\\", ""), regionArray, cdid);
2025-09-10 13:41:50 +08:00
lasaAiAchievementDetail.Image = imgurlend;
}
2025-09-10 10:37:23 +08:00
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);
2025-08-27 16:33:05 +08:00
}
2025-09-10 10:37:23 +08:00
2025-08-27 16:33:05 +08:00
if (db.Commit())
return new Response<bool>
{
Result = true,
Message = "添加成功"
};
else
return new Response<bool>
{
Result = false,
Message = "添加失败"
};
}
}
2025-09-10 13:41:50 +08:00
//public async Task<string> DrawingImgAndUpload(string url, int[][] regionArray)
2025-09-10 14:20:14 +08:00
public async Task<string> DrawingImgAndUpload(string url, int[][] regionArray, string cdid)
2025-09-10 16:48:58 +08:00
{
2025-09-10 14:20:14 +08:00
//string url = "http://123.132.248.154:6015/DroneEnforcement/2025/20250514/lQLPJyIVimQWGKnNA4PNA6Gw1D3q5gbxUvQIiumcIx4vAA_929_899.png";
2025-09-10 13:41:50 +08:00
// detectRegion JSON可以直接替换成你的接口返回数据
2025-09-10 14:20:14 +08:00
//string detectRegionJson = "[[0, 0],[8063, 647],[8017, 7774],[552, 8033]]";
//var regionArray = JsonConvert.DeserializeObject<int[][]>(detectRegionJson);
//Console.WriteLine($"regionArray 是否为空");
2025-09-09 17:24:03 +08:00
2025-09-10 13:41:50 +08:00
//if (regionArray == null || regionArray.Length == 0)
// throw new ArgumentException("detectRegion 参数无效");
2025-09-09 17:24:03 +08:00
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);
}
2025-09-10 14:20:14 +08:00
2025-09-09 17:24:03 +08:00
using (var outputStream = new MemoryStream())
{
bmp.Save(outputStream, ImageFormat.Png);
outputStream.Position = 0;
string fileName = Path.GetFileName(new Uri(url).AbsolutePath);
// 上传到 MinIO直接传 MemoryStream
2025-09-10 14:20:14 +08:00
string uploadedUrl = await _minioService.UploadStreamFile(outputStream, fileName, "test", cdid);
Console.WriteLine("返回imgurl" + uploadedUrl);
2025-09-09 17:24:03 +08:00
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);
}
2025-09-12 09:47:42 +08:00
public async Task<Response<bool>> UpdateState(string id)
{
using (var db = UnitWork.CreateContext())
{
await db.Lasa_ChangeDetection.UpdateAsync(u => new Lasa_ChangeDetection
{
IsFinish = true
}, u => u.Id == id);
if (db.Commit())
return new Response<bool>
{
Result = true,
Message = "检测完成"
};
else
return new Response<bool>
{
Result = false,
Message = "检测完成"
};
}
}
2025-08-27 16:33:05 +08:00
#endregion
#region 本地模型
2025-09-02 14:06:16 +08:00
public async Task<Response<bool>> AddImg(string taskid, string path, string aiid, dynamic drone_info, List<TagItem> tag)
2025-08-27 16:33:05 +08:00
{
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());
2025-09-02 10:06:06 +08:00
var modelinfo = await db.LasaModelLabel.AsQueryable().Where(r => r.PId == aiid).ToListAsync();
2025-09-02 14:06:16 +08:00
double lat = 0.0, lng = 0.0;
if (drone_info != null)
{
2025-09-02 15:37:48 +08:00
//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;
2025-09-02 14:06:16 +08:00
}
2025-08-27 16:33:05 +08:00
if (info == null)
{
LasaAiAchievement lasaAiAchievement = new LasaAiAchievement();
lasaAiAchievement.Id = Guid.NewGuid().ToString();
lasaAiAchievement.CreateTime = DateTime.Now;
lasaAiAchievement.TaskId = taskid;
2025-08-30 08:53:12 +08:00
lasaAiAchievement.AiModel = "yolo12x";
2025-08-27 16:33:05 +08:00
lasaAiAchievement.Tag = item.class_id.ToString();
2025-09-02 09:18:24 +08:00
lasaAiAchievement.AlgoId = aiid;
2025-09-02 10:06:06 +08:00
var modelid = modelinfo.Where(r => r.EnumValue == item.class_id).FirstOrDefault();
if (modelid != null)
2025-08-27 16:33:05 +08:00
{
2025-09-10 16:10:29 +08:00
lasaAiAchievement.Title = modelid.Name;
2025-08-27 16:33:05 +08:00
}
2025-08-27 16:45:53 +08:00
else
{
2025-09-10 16:10:29 +08:00
lasaAiAchievement.Title = "";
2025-08-27 16:45:53 +08:00
}
2025-09-02 10:06:06 +08:00
2025-08-29 16:20:02 +08:00
//var confidence = tag.Select(r => r.confidence).Max();
var confidence = item.confidence;
2025-08-31 10:19:33 +08:00
if (confidence < 0.3)
2025-08-29 16:14:38 +08:00
{
2025-08-29 16:20:02 +08:00
break;
2025-08-29 16:14:38 +08:00
}
2025-08-30 11:20:00 +08:00
lasaAiAchievement.ConfidenceLevel = (float)Math.Round(confidence, 2) * 100;
2025-08-29 16:14:38 +08:00
2025-08-27 16:33:05 +08:00
//插入详情
LasaAiAchievementDetail lasaAiAchievementDetail = new LasaAiAchievementDetail()
{
Id = Guid.NewGuid().ToString(),
2025-08-27 17:11:15 +08:00
Image = "http://175.27.168.120:6013/test/" + path,
2025-09-02 14:06:16 +08:00
AiAchievementId = lasaAiAchievement.Id,
Lat = lat,
Lng = lng
2025-08-27 16:33:05 +08:00
};
2025-08-27 17:11:15 +08:00
lasaAiAchievement.Cover = "http://175.27.168.120:6013/test/" + path;
2025-09-02 14:06:16 +08:00
lasaAiAchievement.Lat = (float)lat;
lasaAiAchievement.Lng = (float)lng;
2025-08-29 15:57:23 +08:00
await db.LasaAiAchievement.InsertAsync(lasaAiAchievement);
2025-08-27 16:33:05 +08:00
await db.LasaAiAchievementDetail.InsertAsync(lasaAiAchievementDetail);
}
else
{
//插入详情
LasaAiAchievementDetail lasaAiAchievementDetail = new LasaAiAchievementDetail()
{
Id = Guid.NewGuid().ToString(),
2025-08-29 11:26:01 +08:00
Image = "http://175.27.168.120:6013/test/" + path,
2025-09-02 14:06:16 +08:00
AiAchievementId = info.Id,
Lat = lat,
Lng = lng
2025-08-27 16:33:05 +08:00
};
await db.LasaAiAchievementDetail.InsertAsync(lasaAiAchievementDetail);
}
}
if (db.Commit())
return new Response<bool>
{
Result = true,
Message = "添加成功"
};
else
return new Response<bool>
{
Result = false,
Message = "添加失败"
};
}
}
#endregion
}
}