2025-09-29 15:40:27 +08:00
|
|
|
|
using DocumentFormat.OpenXml.Bibliography;
|
|
|
|
|
|
using DocumentFormat.OpenXml.EMMA;
|
2025-09-29 10:14:19 +08:00
|
|
|
|
using Infrastructure;
|
2025-09-09 17:24:03 +08:00
|
|
|
|
using Infrastructure.CloudSdk.minio;
|
|
|
|
|
|
using Infrastructure.Extensions;
|
2025-09-29 15:40:27 +08:00
|
|
|
|
using Infrastructure.Helpers;
|
2025-09-18 15:12:52 +08:00
|
|
|
|
using Microsoft.Extensions.Logging;
|
2025-09-29 15:40:27 +08:00
|
|
|
|
using Microsoft.Extensions.Logging.Log4Net.AspNetCore.Entities;
|
2025-09-09 17:24:03 +08:00
|
|
|
|
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-09-29 15:40:27 +08:00
|
|
|
|
using System.Net.Http;
|
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-29 15:40:27 +08:00
|
|
|
|
// 8192坐标系
|
|
|
|
|
|
private const float STANDARD_WIDTH = 8192f;
|
|
|
|
|
|
private const float STANDARD_HEIGHT = 8192f;
|
2025-09-09 17:24:03 +08:00
|
|
|
|
public MinioService _minioService;
|
2025-09-18 15:12:52 +08:00
|
|
|
|
private readonly ILogger<DaHuaAiApp> _logger;
|
|
|
|
|
|
public DaHuaAiApp(ISugarUnitOfWork<SugarDbContext> unitWork, MinioService minioService, ILogger<DaHuaAiApp> logger,
|
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-09-18 15:12:52 +08:00
|
|
|
|
_logger = logger;
|
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-19 17:01:19 +08:00
|
|
|
|
//删除检测记录
|
|
|
|
|
|
await db.Lasa_ChangeDetection.DeleteByIdAsync(cdid);
|
|
|
|
|
|
db.Commit();
|
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-09-18 15:12:52 +08:00
|
|
|
|
_logger.LogError("耕地破坏报警数据;" + 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";
|
2025-09-18 15:12:52 +08:00
|
|
|
|
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,
|
2025-09-13 10:01:21 +08:00
|
|
|
|
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,
|
2025-09-13 10:01:21 +08:00
|
|
|
|
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
|
|
|
|
|
|
|
2025-09-29 15:40:27 +08:00
|
|
|
|
#region 烟雾报警
|
|
|
|
|
|
private static readonly HttpClient httpClient = new HttpClient();
|
|
|
|
|
|
public async Task<Response<bool>> AddDaHuaSmokeDetectionImg(string info)
|
|
|
|
|
|
{
|
|
|
|
|
|
Console.WriteLine(info);
|
|
|
|
|
|
_logger.LogError("烟雾报警数据;" + info);
|
|
|
|
|
|
var config = ConfigHelper.GetConfigRoot();
|
|
|
|
|
|
var ImgUrlIp = config["DaHua:ImgUrl"];
|
|
|
|
|
|
using (var db = UnitWork.CreateContext())
|
|
|
|
|
|
{
|
|
|
|
|
|
var data = JsonConvert.DeserializeObject<dynamic>(info);
|
|
|
|
|
|
var imageList = data.imageList;
|
|
|
|
|
|
foreach (var img in imageList)
|
|
|
|
|
|
{
|
|
|
|
|
|
//var uploadedUrl = await DrawRectanglesOnImageAsync(img.imgUrl.ToString().Replace("\\", ""), img.objectRect);
|
|
|
|
|
|
var uploadedUrl = await DrawRectanglesOnImageAsync(ImgUrlIp + img.imgUrl.ToString().Replace("\\", ""), img.objectRect);
|
|
|
|
|
|
Console.WriteLine($"已处理图片 {uploadedUrl}");
|
|
|
|
|
|
LasaAiAchievement lasaAiAchievement = new LasaAiAchievement();
|
|
|
|
|
|
lasaAiAchievement.Id = Guid.NewGuid().ToString();
|
|
|
|
|
|
lasaAiAchievement.CreateTime = DateTime.Now;
|
|
|
|
|
|
lasaAiAchievement.TaskId = "10";
|
|
|
|
|
|
lasaAiAchievement.AiModel = "DaHuaSmokeDetection";
|
|
|
|
|
|
lasaAiAchievement.Tag = "";
|
|
|
|
|
|
lasaAiAchievement.AlgoId = "";
|
|
|
|
|
|
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(),
|
2025-09-29 16:05:39 +08:00
|
|
|
|
Image = uploadedUrl,
|
2025-09-29 15:40:27 +08:00
|
|
|
|
AiAchievementId = lasaAiAchievement.Id,
|
|
|
|
|
|
//Lat = lat,
|
|
|
|
|
|
//Lng = lng
|
|
|
|
|
|
};
|
2025-09-29 16:05:39 +08:00
|
|
|
|
lasaAiAchievement.Cover = uploadedUrl;
|
2025-09-29 15:40:27 +08:00
|
|
|
|
//lasaAiAchievement.Lat = (float)lat;
|
|
|
|
|
|
//lasaAiAchievement.Lng = (float)lng;
|
|
|
|
|
|
await db.LasaAiAchievement.InsertAsync(lasaAiAchievement);
|
|
|
|
|
|
await db.LasaAiAchievementDetail.InsertAsync(lasaAiAchievementDetail);
|
|
|
|
|
|
}
|
|
|
|
|
|
if (db.Commit())
|
|
|
|
|
|
return new Response<bool>
|
|
|
|
|
|
{
|
|
|
|
|
|
Result = true,
|
|
|
|
|
|
Message = "添加成功"
|
|
|
|
|
|
};
|
|
|
|
|
|
else
|
|
|
|
|
|
return new Response<bool>
|
|
|
|
|
|
{
|
|
|
|
|
|
Result = false,
|
|
|
|
|
|
Message = "添加失败"
|
|
|
|
|
|
};
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 从 URL 下载图片并画框
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public async Task<string> DrawRectanglesOnImageAsync(string url, dynamic rects)
|
|
|
|
|
|
{
|
|
|
|
|
|
try
|
|
|
|
|
|
{
|
|
|
|
|
|
// 下载图片
|
2025-09-29 15:52:09 +08:00
|
|
|
|
//url = "http://123.132.248.154:6015/DroneEnforcement/2025/20250514/localStorage.jpg";
|
2025-09-29 15:40:27 +08:00
|
|
|
|
using var stream = await httpClient.GetStreamAsync(url);
|
|
|
|
|
|
using var image = Image.FromStream(stream);
|
|
|
|
|
|
using var g = Graphics.FromImage(image);
|
|
|
|
|
|
using var pen = new Pen(Color.Red, 5); // 红色粗线
|
|
|
|
|
|
float scaleX = image.Width / STANDARD_WIDTH;
|
|
|
|
|
|
float scaleY = image.Height / STANDARD_HEIGHT;
|
|
|
|
|
|
|
|
|
|
|
|
// 画框
|
|
|
|
|
|
foreach (var rect in rects)
|
|
|
|
|
|
{
|
|
|
|
|
|
int x = (int)(rect.objLeft * scaleX);
|
|
|
|
|
|
int y = (int)(rect.objTop * scaleY);
|
|
|
|
|
|
int width = (int)((rect.objRight - rect.objLeft) * scaleX);
|
|
|
|
|
|
int height = (int)((rect.objBottom - rect.objTop) * scaleY);
|
|
|
|
|
|
|
|
|
|
|
|
if (x < image.Width && y < image.Height && width > 0 && height > 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
g.DrawRectangle(pen, x, y, width, height);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 保存到内存流再上传
|
|
|
|
|
|
using var outputStream = new MemoryStream();
|
|
|
|
|
|
image.Save(outputStream, ImageFormat.Png);
|
|
|
|
|
|
outputStream.Position = 0;
|
|
|
|
|
|
|
|
|
|
|
|
string fileName = Path.GetFileName(new Uri(url).AbsolutePath);
|
|
|
|
|
|
|
|
|
|
|
|
// 上传到 MinIO
|
|
|
|
|
|
string uploadedUrl = await _minioService.UploadStreamFile(outputStream, fileName, "test", "yanwubaojing");
|
|
|
|
|
|
|
|
|
|
|
|
Console.WriteLine("返回 imgurl:" + uploadedUrl);
|
|
|
|
|
|
return uploadedUrl;
|
|
|
|
|
|
}
|
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
|
{
|
|
|
|
|
|
Console.WriteLine($"处理图片失败: {url}, 错误: {ex.Message}");
|
|
|
|
|
|
return string.Empty;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
// 定义矩形对象
|
|
|
|
|
|
public class ObjectRect
|
|
|
|
|
|
{
|
|
|
|
|
|
public int objBottom { get; set; }
|
|
|
|
|
|
public int objLeft { get; set; }
|
|
|
|
|
|
public int objRight { get; set; }
|
|
|
|
|
|
public int objTop { get; set; }
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 定义 imageList 里的结构
|
|
|
|
|
|
public class ImageInfo
|
|
|
|
|
|
{
|
|
|
|
|
|
public int imgHeight { get; set; }
|
|
|
|
|
|
public int imgWidth { get; set; }
|
|
|
|
|
|
public string imgUrl { get; set; }
|
|
|
|
|
|
public List<ObjectRect> objectRect { get; set; }
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public class Root
|
|
|
|
|
|
{
|
|
|
|
|
|
public List<ImageInfo> imageList { get; set; }
|
|
|
|
|
|
}
|
|
|
|
|
|
#endregion
|
2025-08-27 16:33:05 +08:00
|
|
|
|
|
|
|
|
|
|
#region 本地模型
|
2025-09-29 10:14:19 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
///
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="taskid">任务id</param>
|
|
|
|
|
|
/// <param name="path">图片地址</param>
|
|
|
|
|
|
/// <param name="aiid">算法id</param>
|
|
|
|
|
|
/// <param name="drone_info">无人机信息</param>
|
|
|
|
|
|
/// <param name="tag">标签信息</param>
|
|
|
|
|
|
/// <returns></returns>
|
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())
|
|
|
|
|
|
{
|
2025-09-29 10:14:19 +08:00
|
|
|
|
_logger.LogError("标签信息;" + tag);
|
|
|
|
|
|
_logger.LogError("aiid;" + aiid);
|
2025-09-29 15:40:27 +08:00
|
|
|
|
var config = ConfigHelper.GetConfigRoot();
|
|
|
|
|
|
var Ip = "http://" + config["Minio:Endpoint"] + "/" + config["Minio:BucketName"] + "/";
|
2025-08-27 16:33:05 +08:00
|
|
|
|
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-09-29 15:40:27 +08:00
|
|
|
|
//Image = "http://175.27.168.120:6013/test/" + path,
|
|
|
|
|
|
Image = Ip + 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-09-29 15:40:27 +08:00
|
|
|
|
//lasaAiAchievement.Cover = "http://175.27.168.120:6013/test/" + path;
|
|
|
|
|
|
lasaAiAchievement.Cover = Ip + 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-09-29 15:40:27 +08:00
|
|
|
|
Image = Ip + 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
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|