agrobot_base/AgroBase/AgroBase/Services/CameraService.cs

111 lines
3.8 KiB
C#

using AForge.Video.DirectShow;
using AgroBase.Models;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Management;
using System.Threading.Tasks;
using static MqttService;
namespace AgroBase.Services
{
public class CameraService
{
public static Dictionary<string, string> CamerasConectadas = new Dictionary<string, string>();
public Process pythonProcess;
public DateTime? IniciadoEm = null;
public DateTime? ProntoEm = null;
public DateTime? FinalizadoEm = null;
public MqttTopicosModel _mqttTopico;
private string Endereco = "localhost";
public string ArquivoLeitura = "leitura.json";
public int selectedCamera = 0;
private double conf_threshold = 0.5;
private double nms_threshold = 0.4;
public string URLcamera = "";
public void IniciarCamera(string Script, string[] Argumentos, string FlaskPorta, string FlaskUrl, string MqttTopico, Func<MqttTopicosMensagensModel, Task> mqttCallback = null)
{
Task.Run(async () =>
{
_mqttTopico = await Variaveis.MqttService.AdicionarNovoTopico(MqttTopico, true, 1, mqttCallback);
pythonProcess = new Process();
pythonProcess = PythonService.RunScript(Script, Argumentos);
IniciadoEm = DateTime.Now;
URLcamera = "http://" + Endereco + ":" + FlaskPorta + "/" + FlaskUrl +
"?conf_threshold=" + conf_threshold.ToString().Replace(",", ".") +
"&nms_threshold=" + nms_threshold.ToString().Replace(",", ".") +
"&camera_index=" + (selectedCamera - 1);
});
}
private void PythonProcess_Exited(object sender, EventArgs e)
{
FinalizadoEm = DateTime.Now;
}
public static Dictionary<string, string> AtualizaListaCameras()
{
try
{
CamerasConectadas.Clear();
CamerasConectadas.Add("Sem vídeo", "Sem video");
using (var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PnPEntity WHERE (PNPClass = 'Camera')")) // PNPClass = 'Image' OR PNPClass = 'Camera')
{
int i = 0;
foreach (var device in searcher.Get())
{
string cameraDesc = i.ToString() + " - " + device["Caption"].ToString();
CamerasConectadas.Add(cameraDesc, device["DeviceID"].ToString());
i++;
}
}
}
catch (ApplicationException)
{
}
return CamerasConectadas;
}
public static Dictionary<string, string> ObterListaCameras()
{
var cameras = new Dictionary<string, string>();
try
{
FilterInfoCollection videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
cameras.Add("Sem vídeo", "Sem video");
int index = 0;
foreach (FilterInfo device in videoDevices)
{
string cameraDesc = $"{index} - {device.Name}";
cameras.Add(cameraDesc, device.MonikerString);
index++;
}
}
catch (Exception ex)
{
Console.WriteLine($"Erro ao listar câmeras: {ex.Message}");
}
return cameras;
}
}
public class CamerasVaraiveisModel
{
public static string TopicoEnvioBitmap { get; set; } = "street_detector_send";
public static string TopicoRecebimentoBitmap { get; set; } = "street_detector_receive";
}
}