187 lines
6.7 KiB
C#
187 lines
6.7 KiB
C#
using AgroBase.Models;
|
|
using AgroBase.Models.Operadores;
|
|
using AgroBase.Services;
|
|
using AgroBase.Services.Operadores;
|
|
using Newtonsoft.Json;
|
|
using StackExchange.Redis;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel;
|
|
using System.Data;
|
|
using System.Drawing;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using System.Windows.Forms;
|
|
using static AgroBase.Models.Enums;
|
|
|
|
namespace AgroBase.Forms.Simuladores
|
|
{
|
|
public partial class frmSimulacaoMapeamentoVisual : Form
|
|
{
|
|
private List<string> imagens = new List<string>();
|
|
private int indiceAtual = 0;
|
|
private string pastaSelecionada = "";
|
|
private readonly object imgLock = new object();
|
|
|
|
public frmSimulacaoMapeamentoVisual()
|
|
{
|
|
InitializeComponent();
|
|
}
|
|
|
|
private void btnCarregarFotos_Click(object sender, EventArgs e)
|
|
{
|
|
using (var dialog = new FolderBrowserDialog())
|
|
{
|
|
if (dialog.ShowDialog() == DialogResult.OK)
|
|
{
|
|
pastaSelecionada = dialog.SelectedPath;
|
|
imagens = Directory.GetFiles(pastaSelecionada, "*_rgb.jpeg", SearchOption.TopDirectoryOnly)
|
|
.OrderBy(f =>
|
|
{
|
|
var nome = Path.GetFileNameWithoutExtension(f);
|
|
var numTexto = nome.Split('_').FirstOrDefault();
|
|
return int.TryParse(numTexto, out int num) ? num : int.MaxValue;
|
|
})
|
|
.ToList();
|
|
indiceAtual = 0;
|
|
MostrarImagemAtual();
|
|
}
|
|
}
|
|
}
|
|
|
|
private void MostrarImagemAtual()
|
|
{
|
|
if (imagens.Count == 0 || indiceAtual < 0 || indiceAtual >= imagens.Count)
|
|
return;
|
|
|
|
var caminho = imagens[indiceAtual];
|
|
var bmpTemp = new Bitmap(caminho); // evita locking de arquivo
|
|
imgOriginal.Image = new Bitmap(bmpTemp);
|
|
|
|
lblInfo.Text = $"{indiceAtual + 1}/{imagens.Count} - {Path.GetFileName(caminho)}";
|
|
|
|
Task.Run(async () => await EnviarImagemVisualWorker(caminho));
|
|
}
|
|
|
|
private void AtualizarDadosTela()
|
|
{
|
|
Task.Run(async () =>
|
|
{
|
|
OAKCameraFrameModel frame = await VisualWorkerService.GetCameraFrame(TipoFrameCamera.Segmentacao);
|
|
var dadosSeg = Variaveis.OperacaoEmAndamento.Sensoriamento.OperadorVisual.Analises.segmentacao;
|
|
DesenharCorredor(frame?.image(), dadosSeg.centros_corredor, dadosSeg.width, dadosSeg.height, 80);
|
|
|
|
this.Invoke((MethodInvoker)(() =>
|
|
{
|
|
var _controle = Variaveis.OperacaoEmAndamento.Controle;
|
|
txtErroAngular.Text = dadosSeg.erro_angular.ToString();
|
|
txtErroLateral.Text = dadosSeg.erro_lateral_pct.ToString();
|
|
txtStatusCarro.Text = dadosSeg.status_corredor.ToString();
|
|
txtVelocidadeSP.Text = _controle.PercentualVelocidadeSP.ToString();
|
|
txtAnguloSP.Text = _controle.Angulo.ToString();
|
|
txtTipoMovimento.Text = _controle.TipoMovimento.ToString();
|
|
txtImagemAtual.Text = indiceAtual.ToString();
|
|
}));
|
|
});
|
|
}
|
|
|
|
private async Task EnviarImagemVisualWorker(string caminho)
|
|
{
|
|
var comando = new
|
|
{
|
|
cmd = VisualWorkerCommandType.EnviarImagemMock,
|
|
@params = caminho
|
|
};
|
|
RedisService.Publish(CmdKey.VisualWorkerRx, JsonConvert.SerializeObject(comando));
|
|
|
|
await Task.Delay(50);
|
|
|
|
AtualizarDadosTela();
|
|
}
|
|
|
|
private void DesenharCorredor(Bitmap imagemBase, List<double?[]> centrosCorredor, int largura, int altura, int larguraRoboPx)
|
|
{
|
|
try
|
|
{
|
|
if (imagemBase == null)
|
|
return;
|
|
|
|
Bitmap imagemComDesenho = new Bitmap(imagemBase.Clone() as Bitmap);
|
|
|
|
using (Graphics g = Graphics.FromImage(imagemComDesenho))
|
|
{
|
|
Pen penCentro = new Pen(Color.Yellow, 2);
|
|
Pen penLargura = new Pen(Color.Magenta, 1);
|
|
Brush brushCentro = Brushes.Yellow;
|
|
|
|
float fatorX = (float)imagemBase.Width / largura;
|
|
float fatorY = (float)imagemBase.Height / altura;
|
|
|
|
for (int i = 0; i < centrosCorredor.Count; i++)
|
|
{
|
|
Point ponto = new Point(
|
|
(int)(centrosCorredor[i][0] * fatorX),
|
|
(int)(centrosCorredor[i][1] * fatorY)
|
|
);
|
|
|
|
g.FillEllipse(brushCentro, ponto.X - 2, ponto.Y - 2, 4, 4);
|
|
g.DrawLine(penLargura, ponto.X - larguraRoboPx / 2, ponto.Y, ponto.X + larguraRoboPx / 2, ponto.Y);
|
|
|
|
if (i < centrosCorredor.Count - 1)
|
|
{
|
|
Point proximoPonto = new Point((int)(centrosCorredor[i + 1][0] * fatorX), (int)(centrosCorredor[i + 1][1] * fatorY));
|
|
g.DrawLine(penCentro, ponto, proximoPonto);
|
|
}
|
|
}
|
|
}
|
|
|
|
this.Invoke((MethodInvoker)(() =>
|
|
{
|
|
imgSegmentacao.Image?.Dispose();
|
|
imgSegmentacao.Image = imagemComDesenho;
|
|
}));
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine("Erro ao desenhar corredor: " + ex.Message);
|
|
}
|
|
}
|
|
|
|
private void btnAnterior_Click(object sender, EventArgs e)
|
|
{
|
|
if (indiceAtual > 0)
|
|
{
|
|
indiceAtual--;
|
|
MostrarImagemAtual();
|
|
}
|
|
}
|
|
|
|
private void btnProximo_Click(object sender, EventArgs e)
|
|
{
|
|
if (indiceAtual < imagens.Count - 1)
|
|
{
|
|
indiceAtual++;
|
|
MostrarImagemAtual();
|
|
}
|
|
}
|
|
|
|
private void btnIr_Click(object sender, EventArgs e)
|
|
{
|
|
indiceAtual = Convert.ToInt32(txtImagemAtual.Text);
|
|
MostrarImagemAtual();
|
|
}
|
|
|
|
private void btnIniciarSimulacao_Click(object sender, EventArgs e)
|
|
{
|
|
Variaveis.OperacaoEmAndamento.IniciarSimulacao();
|
|
}
|
|
|
|
private void btnAtualizar_Click(object sender, EventArgs e)
|
|
{
|
|
AtualizarDadosTela();
|
|
}
|
|
}
|
|
}
|