Требуется помощь в преобразовании 2D-изображений в 3D-точки с использованием C# и Three.js.C#

Место общения программистов C#
Ответить
Anonymous
 Требуется помощь в преобразовании 2D-изображений в 3D-точки с использованием C# и Three.js.

Сообщение Anonymous »

Я пытаюсь обработать эти 4 изображения для куба с 4 камерами, которые образуют контур куба. Он преобразуется в файл XYZ, и я использую библиотеку Three.js для проецирования точек красной линии, которую я сканирую по горизонтали и вертикали, преобразуя ее из 2D в 3D.
Я координата Y уже есть, но координаты X и Z вычисляются на основе логики кода. Однако когда я рисую 3D-точки, они неправильно формируют контур. Точки неправильные. Не могли бы вы мне помочь?

Код: Выделить всё

private void button2_Click(object sender, EventArgs e)
{
try
{
// Pasta onde estão as imagens
string pastaImagens = "imgs/";
string arquivoSaida = "pontosLinhaPonteiro.xyz";

// Apagar o arquivo de saída anterior, se existir
if (File.Exists(arquivoSaida))
{
File.Delete(arquivoSaida);
}

// Obter a quantidade de imagens (assumindo 4 imagens por conjunto: A, B, C, D)
if (Directory.Exists(pastaImagens))
{
var arquivosImagens = Directory.GetFiles(pastaImagens, "*.bmp");
int qtdImagens = arquivosImagens.Length / 4; // 4 câmeras por conjunto (A, B, C, D)

// Processar cada conjunto de imagens
for (int i = 0; i < qtdImagens; i++)
{
// Chamar a função para cada câmera
EncontrarLinhaLaserPonteiro($"{pastaImagens}{i}A.bmp", i + 20, "A");
EncontrarLinhaLaserPonteiro($"{pastaImagens}{i}B.bmp", i + 20, "B");
EncontrarLinhaLaserPonteiro($"{pastaImagens}{i}C.bmp", i + 20, "C");
EncontrarLinhaLaserPonteiro($"{pastaImagens}{i}D.bmp", i + 20, "D");
}

// Informar o usuário que o processamento foi concluído
MessageBox.Show($"Processamento concluído. Pontos salvos em '{arquivoSaida}'.",
"Sucesso", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
MessageBox.Show($"Pasta '{pastaImagens}' não encontrada.  Verifique o caminho.",
"Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
catch (Exception ex)
{
// Exibir mensagem de erro, caso ocorra algum problema
MessageBox.Show($"Ocorreu um erro: {ex.Message}",
"Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}

public void EncontrarLinhaLaserPonteiro(string caminho, int y, string camera)
{
StringBuilder pontos = new StringBuilder();

Bitmap img = new Bitmap(caminho);
int imageWidth = img.Width;
int imageHeight = img.Height;

int centerX = imageWidth / 2; // W/2
int centerY = imageHeight / 2; // H/2

BitmapData bitmapData = img.LockBits(new Rectangle(0, 0, imageWidth, imageHeight), ImageLockMode.ReadOnly, img.PixelFormat);
int bytesPerPixel = Bitmap.GetPixelFormatSize(img.PixelFormat) / 8;
int stride = bitmapData.Stride;
IntPtr scan0 = bitmapData.Scan0;

unsafe
{
byte* p = (byte*)(void*)scan0;

// Varredura Horizontal
Parallel.For(0, imageHeight, j =>
{
int linhaInicio = -1;
int linhaFim = -1;
int linhaComprimento = 0;

for (int i = 0; i < imageWidth; i++)
{
byte* pixel = p + j * stride + i * bytesPerPixel;

if (pixel[2] > 160 && pixel[1] < 80 && pixel[0] < 80) // Pixel vermelho
{
if (linhaInicio == -1)
{
linhaInicio = i;
}
linhaFim = i;
linhaComprimento++;
}
else
{
if (linhaComprimento >= 1 && linhaComprimento = 1 &&  linhaComprimento 
{
int linhaInicio = -1;
int linhaFim = -1;
int linhaComprimento = 0;

for (int j = 0; j < imageHeight; j++)
{
byte* pixel = p + j * stride + i * bytesPerPixel;

if (pixel[2] > 160 && pixel[1] < 80 && pixel[0] < 80) // Pixel vermelho
{
if (linhaInicio == -1)
{
linhaInicio = j;
}
linhaFim = j;
linhaComprimento++;
}
else
{
if (linhaComprimento >= 1 && linhaComprimento = 1 &&  linhaComprimento 

Подробнее здесь: [url]https://stackoverflow.com/questions/79202289/assistance-needed-with-converting-2d-images-to-3d-points-using-c-sharp-and-three[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»