#define cxx_server
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Runtime.InteropServices.ComTypes;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Newtonsoft.Json;
using OpenCvSharp;
using System.Drawing;
using OpenCvSharp.Extensions;
using Newtonsoft.Json.Linq;
using System.Runtime.InteropServices;
using System.Security.Policy;
using static OpenCvSharp.XImgProc.CvXImgProc;
namespace OTSModelSharp.ServiceCenter
{
public class class_result
{
public string Result { get; set; }
public float Confidence { get; set; }
}
public class AI_HttpClient
{
///
/// 从分割模型获取二值图
///
/// 包括ip地址端口号
/// 输入mat 3通道 bgr格式
/// 输出mat 灰度图
/// 模型类别和模型配置文件对应
/// 模型序号和模型配置文件对应
/// input mat 原图完整路径
public static void AI_SegmentImage(string baseUrl, Mat input, ref Mat output, int catagory = 1000, int item = 1, string filename = "1.jpg")
{
#if cxx_server
AI_SegmentImage_cxx(baseUrl, input, ref output, catagory, item, filename);
#else
AI_SegmentImage_cshape(baseUrl, input, ref output, catagory, item, filename);
#endif
}
///
/// 从模型获得分类结果 需做进一步筛选获得分类
///
///
/// 输入mat 3通道 bgr格式
/// label confiden 字典
/// 模型类别和模型配置文件对应
/// 模型序号和模型配置文件对应
/// input mat 原图完整路径
public static void AI_ClassImage(string baseUrl, Mat input, ref Dictionary resultDic, int catagory = 1000, int item = 2, string filename = "1.jpg")
{
#if cxx_server
AI_ClassImage_cxx(baseUrl, input, ref resultDic, catagory, item, filename);
#else
AI_ClassImage_cshape(baseUrl, input, ref resultDic, catagory, item, filename);
#endif
}
///
/// 从分割模型获取二值图 cshape httpserver
///
/// 包括ip地址端口号
/// 输入mat 3通道 bgr格式
/// 输出mat 灰度图
/// 模型类别和模型配置文件对应
/// 模型序号和模型配置文件对应
/// input mat 原图完整路径
public static void AI_SegmentImage_cshape(string baseUrl, Mat input, ref Mat output, int catagory = 1000, int item = 1, string filename = "1.jpg")
{
string reqUrl = baseUrl + "/api/MetalAI/SegmentImage?catagory=" + catagory.ToString() + "&item=" + item.ToString();
try
{
HttpClient client = new HttpClient(new HttpClientHandler() { UseCookies = false });
var postContent = new MultipartFormDataContent();
string boundary = string.Format("--{0}", DateTime.Now.Ticks.ToString("x"));
postContent.Headers.Add("ContentType", $"multipart/form-data, boundary={boundary}");
MemoryStream ms = input.ToMemoryStream(".jpg");
postContent.Add(new StreamContent(ms, (int)ms.Length), "formFiles", Path.GetFileName(filename));
var response = client.PostAsync(reqUrl, postContent).Result;
Console.WriteLine(response);
if (response.IsSuccessStatusCode)
{
var streamFromService = response.Content.ReadAsStreamAsync().Result;
Bitmap bmp = new Bitmap(streamFromService);
output = BitmapConverter.ToMat(bmp);
if (output.Channels() == 4)
{
Cv2.CvtColor(output, output, ColorConversionCodes.BGRA2GRAY);
}
return;
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
///
/// 从模型获得分类结果 需做进一步筛选获得分类 cshape httpserver
///
///
/// 输入mat 3通道 bgr格式
/// label confiden 字典
/// 模型类别和模型配置文件对应
/// 模型序号和模型配置文件对应
/// input mat 原图完整路径
public static void AI_ClassImage_cshape(string baseUrl, Mat input, ref Dictionary resultDic, int catagory = 1000, int item = 2, string filename = "1.jpg")
{
string reqUrl = baseUrl + "/api/MetalAI/Classify?catagory=" + catagory.ToString() + "&item=" + item.ToString();
try
{
HttpClient client = new HttpClient(new HttpClientHandler() { UseCookies = false });
var postContent = new MultipartFormDataContent();
string boundary = string.Format("--{0}", DateTime.Now.Ticks.ToString("x"));
postContent.Headers.Add("ContentType", $"multipart/form-data, boundary={boundary}");
MemoryStream ms = input.ToMemoryStream(".jpg");
postContent.Add(new StreamContent(ms, (int)ms.Length), "formFiles", Path.GetFileName(filename));
var response = client.PostAsync(reqUrl, postContent).Result;
//Console.WriteLine(response);
if (response.IsSuccessStatusCode)
{
var streamFromService = response.Content.ReadAsStringAsync().Result;
resultDic = JsonConvert.DeserializeObject>(streamFromService);
//var maxItem = resultDic.OrderByDescending(kvp => double.Parse(kvp.Value)).FirstOrDefault();//获取得分最大元素的方法
return;
}
}
catch (Exception ex)
{
// throw new Exception("保存file异常");
Console.WriteLine(ex.ToString());
}
}
public static bool AI_Test(string baseUrl)
{
bool connect=false;
string reqUrl = baseUrl + "/api/metalai/Test";
try
{
HttpClient client = new HttpClient(new HttpClientHandler() { UseCookies = false });
client.Timeout= TimeSpan.FromSeconds(3);
var response = client.GetAsync(reqUrl).Result;
//Console.WriteLine(response);
if (response.IsSuccessStatusCode)
{
connect=true;
}
}
catch (Exception ex)
{
// throw new Exception("保存file异常");
Console.WriteLine(ex.ToString());
return false;
}
return connect;
}
///
/// c++ 服务器 分类模型
///
///
///
///
///
///
///
public static void AI_ClassImage_cxx(string baseUrl, Mat input, ref Dictionary resultDic, int catagory = 1000, int item = 2, string filename = "1.jpg")
{
baseUrl = baseUrl + "/api/MetalAI/Classify";
if (input.Empty())
{
return;
}
class_result result = new class_result();
Dictionary resluts = new Dictionary();
using (var client = new HttpClient())
{
// Create the query parameters
var query = $"?category={catagory}&item={item}";
// Read the image into a byte array
byte[] imageBytes;
Cv2.ImEncode(".png", input, out imageBytes);
// Create the content with image data
var imageContent = new ByteArrayContent(imageBytes);
//imageContent.Headers.ContentLength= imageBytes1.Length;
Console.WriteLine(imageBytes.Length);
// Send the POST request with query parameters
var fullUrl = baseUrl + query;
try
{
}
catch (Exception)
{
throw;
}
var response = client.PostAsync(fullUrl, imageContent).Result;
if (response.IsSuccessStatusCode)
{
var responseData = response.Content.ReadAsStringAsync().Result;
// var result1 = JsonConvert.DeserializeObject(responseData);
resluts = JsonConvert.DeserializeObject>(responseData);
foreach (var reslt in resluts)
{
resultDic.Add(reslt.Key, reslt.Value.ToString());
}
}
else
{
Console.WriteLine($"HTTP request failed with status code {response.StatusCode}");
}
}
}
///
/// c++服务器 unet
///
///
///
///
///
///
///
public static void AI_SegmentImage_cxx(string baseUrl, Mat input, ref Mat output, int catagory = 1000, int item = 1, string filename = "1.jpg")
{
baseUrl = baseUrl + "/api/MetalAI/SegmentImage";
if (input.Empty())
{
return;
}
// Create the query parameters
var query = $"?category={catagory}&item={item}";
var fullUrl = baseUrl + query;
send_image(fullUrl, input, ref output);
}
public static void UploadFile(string url, string filePath)
{
using (var client = new HttpClient())
using (var content = new MultipartFormDataContent())
{
var fileContent = new StreamContent(new FileStream(filePath, FileMode.Open, FileAccess.Read));
fileContent.Headers.ContentType = MediaTypeHeaderValue.Parse("image/jpeg"); // 设置正确的MIME类型
content.Add(fileContent, "file", Path.GetFileName(filePath)); // "file"是服务器期望的表单字段名
var response = client.PostAsync(url, content).Result; // 使用.Result等待异步操作完成,这将阻塞当前线程
if (response.IsSuccessStatusCode)
{
Console.WriteLine("File uploaded successfully.");
}
else
{
Console.WriteLine("Error uploading file: " + response.StatusCode);
}
}
}
public static void send_image(string fullUrl, Mat input, ref Mat output)
{
using (var client = new HttpClient())
{
// Create the query parameters
// Read the image into a byte array
byte[] imageBytes;
Cv2.ImEncode(".png", input, out imageBytes);
// Create the content with image data
var imageContent = new ByteArrayContent(imageBytes);
Console.WriteLine(imageBytes.Length);
// Send the POST request with query parameters
var response = client.PostAsync(fullUrl, imageContent).Result;
if (response.IsSuccessStatusCode)
{
//var responseData = response.Content.ReadAsStringAsync().Result;
var streamFromService = response.Content.ReadAsByteArrayAsync().Result;
try
{
output = Cv2.ImDecode(streamFromService, ImreadModes.Grayscale);
}
catch (Exception)
{
throw;
}
}
else
{
Console.WriteLine($"HTTP request failed with status code {response.StatusCode} ");
}
}
}
public static void AI_SegformerImage_cxx(string baseUrl, Mat input, ref Mat output, int catagory = 1000, int item = 1)
{
baseUrl = baseUrl + "/api/MetalAI/SegformerImage";
if (input.Empty())
{
return;
}
var query = $"?category={catagory}&item={item}";
var fullUrl = baseUrl + query;
send_image(fullUrl, input, ref output);
}
}
}