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

367 lines
17 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)
{
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<dynamic> dataList = new List<dynamic>();
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<List<dynamic>>
{
Result = dataList,
Message = "获取数据成功"
};
}
}
public async Task<Response<bool>> AddDaHuaImg(string info)
{
using (var db = UnitWork.CreateContext())
{
var data = JsonConvert.DeserializeObject<dynamic>(info);
string detectRegionJson = JsonConvert.SerializeObject(data.info.detectRegion);
var regionArray = JsonConvert.DeserializeObject<dynamic>(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<bool>
{
Result = true,
Message = "添加成功"
};
else
return new Response<bool>
{
Result = false,
Message = "添加失败"
};
}
}
public async Task<string> DrawingImgAndUpload(string url, dynamic regionArray)
{
//var regionArray = JsonConvert.DeserializeObject<int[][]>(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<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
{
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<bool>
{
Result = true,
Message = "添加成功"
};
else
return new Response<bool>
{
Result = false,
Message = "添加失败"
};
}
}
#endregion
}
}