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 { public MinioService _minioService; public DaHuaAiApp(ISugarUnitOfWork unitWork, MinioService minioService, ISimpleClient repository, IAuth auth) : base(unitWork, repository, auth) { _minioService = minioService; } #region 大华算法 //分析两次航线图片 public async Task>> BehaviorAlarm(string firstId, string secondId) { using (var db = UnitWork.CreateContext()) { //var imageList1 = await db.LasaMediaFile.AsQueryable().Where(r => r.TaskId == firstId && r.AbsoluteAltitude != 0 && r.AbsoluteAltitude != null).ToListAsync(); //var imageList2 = await db.LasaMediaFile.AsQueryable().Where(r => r.TaskId == secondId && r.AbsoluteAltitude != 0 && r.AbsoluteAltitude != null).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 dataList = new List(); 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(), 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> { Result = dataList, Message = "获取数据成功" }; } } public async Task> AddDaHuaImg(string info) { using (var db = UnitWork.CreateContext()) { var data = JsonConvert.DeserializeObject(info); string detectRegionJson = JsonConvert.SerializeObject(data.info.detectRegion); var regionArray = JsonConvert.DeserializeObject(detectRegionJson); LasaAiAchievement lasaAiAchievement = new LasaAiAchievement { Id = Guid.NewGuid().ToString(), Title = "耕地破坏区域报警", CreateTime = DateTime.Now, AiModel = "DaHuaAi" }; var imageList = data.imageInfoList; int index = 0; 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, }; //// 如果是第二张图片 -> 画区域 + 上传 //var a = await DrawingImgAndUpload(item.imgUrl, regionArray); //if (index == 1) //{ // //DrawingImgAsync(); // Console.WriteLine(item.imgUrl); // Console.WriteLine(regionArray); // a = await DrawingImgAndUpload(item.imgUrl, regionArray); // lasaAiAchievementDetail.Image = a; //} lasaAiAchievement.Lat = item.latitude; lasaAiAchievement.Lng = item.longitude; lasaAiAchievement.Cover = item.imgUrl; await db.LasaAiAchievementDetail.InsertAsync(lasaAiAchievementDetail); index++; } await db.LasaAiAchievement.InsertAsync(lasaAiAchievement); if (db.Commit()) return new Response { Result = true, Message = "添加成功" }; else return new Response { Result = false, Message = "添加失败" }; } } public async Task DrawingImgAndUpload(string url, dynamic regionArray) { //var regionArray = JsonConvert.DeserializeObject(detectRegionJson); Console.WriteLine($"regionArray 是否为空: {regionArray == null}, 长度: {regionArray?.Length}"); 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)) using (var brush = new SolidBrush(Color.FromArgb(80, Color.Blue))) { g.FillPolygon(brush, polygon); 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", Guid.NewGuid().ToString()); Console.WriteLine(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(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> AddImg(string taskid, string path, string aiid, dynamic drone_info, List 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() ?? 0.0; //lng = root?["data"]?["longitude"]?.GetValue() ?? 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 = "其他识别"; //if (item.class_id == 1 || item.class_id == 2 || item.class_id == 3 || item.class_id == 5 || item.class_id == 6 || item.class_id == 7) //{ // lasaAiAchievement.Title = "车辆识别"; //} //else if (item.class_id == 0) //{ // lasaAiAchievement.Title = "人员识别"; //} //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 { Result = true, Message = "添加成功" }; else return new Response { Result = false, Message = "添加失败" }; } } #endregion } }