Expresate

Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:

Avisos
Vaciar todo

Visión artificial

467 Respuestas
43 Usuarios
0 Reactions
1.1 M Visitas
mif
Respuestas: 1095
 Mif
Topic starter
(@mif)
Noble Member
Registrado: hace 20 años

Como ya estoy de medio vacaciones, pero a la vez no tengo demasiados medios técnicos, me dedico a recopilar datos y a procesarlos como puedo en mi cabecilla, para poder hacer cosas en verano.

Como sabeis estoy con el tema del Bluetooth... a falta de hacer algunas pruebas con otro ordenador, el tema del TouchPad... necesito más medios que mi portatil... y... ahora viene el proyecto guapi guapi... Visión artificial con una simple webcam, entonces aqui vienen mis preguntas y aclaraciones:
·Sé que es posible, porque si no me equivoco Golfus Hispanicus lo emplea, asi como otros proyectos como los de esta chiquita tan maja: Mavis
·¿Cómo se empieza en este mundito?
·¿Qué librerías usais para obtener imágenes de la webcam?
·¿Qué librerías usais para procesar la imagen?
·¿Es imprescindible programar el sistema en C?
·¿Tenemos algun proyecto de ejemplo?

Yo estoy comenzando con la librería WebCam.dll, pero me temo que es muy incompleta, y además consume demasiados recursos comparándolo con el proyecto de Mavis. Aun así, tengo un programa hecho que lo único que tiene es un botón, con el que al pulsarlo, se copia la imágen de la webcam en un control PictureBox... me imagino que es un primer paso en este mundo, y que me quedan miles de caminos que recorrer, pero esta librería no sé si da mucho más de si, de modo que me gustaría que alguno que haya trabajado con esto me eche un cablecillo.

Seguiré informando. Muchas gracias por la ayuda.
Ángel


Responder
466 respuestas
mif
Respuestas: 1095
 Mif
Topic starter
(@mif)
Noble Member
Registrado: hace 20 años

Me alegro de que mi trabajo sirviese de algo... 🙂 A ver que tal te tira la maquina que estas montando, yo tenia en mente hacer lo mnismo, pero creo que me da un poco de miedo poner el portatil a que ande y corra por el mundo, asi que he decidido comprarme una camara inalambrica, y una capturadora, el robot manejado con un mando de coche teledirigido, y el tema esta solucionado, entre otras cosas te ahorras el tema de los motores potentes... Pero como veo que tu si los vas a necesitar, yo creo que lo mejor que puedes hacer es pillarte un taladro del Auchan, que salen baratos, y malisimos para taladrar, pero para adaptarle unas ruedas estan muy bien, tienen mucha fuerza, y una velocidad aceptable para que el portatil no corra mas que tu. No tienen encoder, pero te lo puedes construir tu... en caso de que quieras controlar la posicion de la rueda... casi mejor unos paso a paso, te das una pasadita por los contenedoires o chatarreros del barrio, y miras a ver si tienen impresoras matriciales, llevan los PAP mas guapos de todos, tienen un par muy bueno, y no son dificiles de usar, ademas en una impresora encontraras tb el Driver.

En cuanto a lo de los clanes de la C.P. te puedop decir lo que nos ha contado Mundobot a los que vamos de ayudantes. Cuando te apuntas a un clan, te aseguras que vas a estar sentado en la misma mesa que los del mismo clan, interesante, porque si no te pueden mandar a la otra punta, claro. Si aun no tienes nada elegido, yo te diria que te metas en el clan de ARDE, asi nos conocemos todos los del foro, de momento estamos:
-UCfort
-HBaleares
-mundobot
-rashield
-jariza
-Domi
-Mif
-Maria
-anivar

Promete ser divertido.


Responder
rashii
Respuestas: 530
(@rashii)
Ardero
Registrado: hace 20 años

Si, solo un apunte, la contraseña del clan es robotica , apuntaros todos los que querais, y asi nos conocemos alli todos 😆


Responder
merlin
Respuestas: 43
(@merlin)
Eminent Member
Registrado: hace 20 años

Mif, muchas gracias, lo de los motores de los taladros es una buena idea, y ademas baratos, en cuanto al clan de ARDE ya me he apuntado, mi NICK es juanito, no coincide con mi NICK en el foro por error al registrarme en la Campus.


Responder
ranganok
Respuestas: 3875
(@ranganok)
Ardero
Registrado: hace 20 años

Hola,

Siguiendo el manual de Mif pero en convirtiendo el código a C# he creado mi primer programa para controlar la WebCam

La bolsa de chuches de publicidad es lo que tenia a mano de color azul.

Aqui abajo os pongo el código en C#, el form se crea igual que en el tutorial (por cierto Mif te has olvidado de declarar TrackBarY en el form y por perreria no lo he puesto).

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WebCam1
{
public partial class Form1 : Form
{
public EventHandler hh;

public Form1()
{
InitializeComponent();
//Inicialización de los eventos
EventHandler bMuestraHandler = new EventHandler(ButMuestra_Click);
EventHandler bDetenetHandler = new EventHandler(ButDetener_Click);
EventHandler bConfiguracionHandler = new EventHandler(ButConfiguracion_Click);
EventHandler bBuscaAzulHandler = new EventHandler(ButBuscaAzul_Click);
EventHandler tMuestreoHandler = new EventHandler(TimMuestreo_Tick);
ButMuestra.Click += bMuestraHandler;
ButDetener.Click += bDetenetHandler;
ButConfiguracion.Click += bConfiguracionHandler;
ButBuscaAzul.Click += bBuscaAzulHandler;
TimMuestreo.Tick += tMuestreoHandler;
}

//Función del botón de toma de muestra
private void ButMuestra_Click(object sender, System.EventArgs e)
{

WebCam1.Start(); //Activa la WebCam
PicResultado.Image = WebCam1.Imagen; //Pasa una muestra al para ver el resultado
}

//Función del botón Detener
private void ButDetener_Click(object sender, System.EventArgs e)
{
WebCam1.Stop(); //Simplemente detiene la camara y deja los últimos fotogramas
TimMuestreo.Enabled = false; //También detendremos el temporizador
}

//Función del botón de configuración
private void ButConfiguracion_Click(object sender, System.EventArgs e)
{
WebCam1.Configuracion(); //Abre una pantalla de configuración de la webcam
}
//Función del botón de Búsqueda de Azul
private void ButBuscaAzul_Click(object sender, System.EventArgs e)
{
WebCam1.Start(); //Activa la WebCam
TimMuestreo.Enabled = true; //Activa el timer que nos generará el muestreo
}
private void TimMuestreo_Tick(object sender, System.EventArgs e)
{
//Pasamos el fotograma actual al PictureBox para ver lo que hay
PicResultado.Image = WebCam1.Imagen;
//Declaramos un par de objetos Bitmap para trabajar sin que se vea.
//Declararemos dos para facilitar la comprensión del código
Bitmap ImgOriginal = (Bitmap)PicResultado.Image;
Bitmap ImgResultante = (Bitmap)PicResultado.Image;
//Declaramos una variable para cada color. Son de tipo entero porque
//Serán valores entre 0 y 255
int Rojo, Verde, Azul;
//Necesitaremos dos variables para guardar las coordenadas del último punto azul
int UltimoAzulX = 0;
int UltimoAzulY=0;
//La tolerancia nos permitirá no ser tan estrictos con la selección de color
int Tolerancia;
//Las variables x e y servirán para guardar coordenadas actuales
int x, y;
//Pondremos una tolerancia de 5 unidades de color.
//Cada uno debe ajustarla según sus necesidades por el contraste de la imagen
Tolerancia = 5;
//Ahora recorreremos la imagen del objeto ImgOriginal como si fuese una
//matriz, de modo que iremos por las horizontales en orden.
//Para no perder mucho tiempo en el análisis de cada pixel, haremos
//que los salte de 10 en 10 tanto en vertical como en horizontal
for(y = 0; y<ImgOriginal.Height - 1; y+=10)
{
for(x = 0; x<ImgOriginal>= Rojo - Tolerancia) //Si hay más azul que rojo sigue
{
if(Azul >= Verde - Tolerancia) //Si hay mas azul que verde sigue
{
//si llega hasta aquí es porque el pixel es suficientemente azul
//así que lo pintamos con un punto de 2x2 en amarillo.
//Ésta es una manera de pintar cuadrados, pero luego vemos otra.
ImgResultante.SetPixel(x, y, Color.Yellow);
ImgResultante.SetPixel(x + 1, y, Color.Yellow);
ImgResultante.SetPixel(x + 1, y + 1, Color.Yellow);
ImgResultante.SetPixel(x, y + 1, Color.Yellow);
//Guardamos la posición x y de este pixel azul, si es el último
//se quedará aquí, porque no habrá más azules
UltimoAzulX = x;
UltimoAzulY = y;
}
}
else
{
//Si entra aquí es porque el pixel no era suficientemente azul
//así que pondremos un punto de 1 pixel en negro.
ImgResultante.SetPixel(x, y, Color.Black);
}
} //Fin del análisis del pixel x, y
} //Fin de la línea horizontal pasa a la siguiente (y+1)
//Pintaremos un cuadrado de 4 x 4 en las coordenadas del último pixel azul
for(y = UltimoAzulY; y<UltimoAzulY + 4; y++)
{
for(x = UltimoAzulX; x<UltimoAzulX + 4; x++)
{
//Estos if sirven para no salirnos de la tabla (de la imagen), porque
//si lo hacemos tendremos un error
if (y < ImgResultante.Height)
if (x < ImgResultante.Width)
ImgResultante.SetPixel(x, y, Color.Red);
} //ya está pintado el pixel con coordenadas UltimoAzulX y UltimoAzulY, a por otro
} //ya están los cuatro horizontales, a por la siguiente fila
//Pasamos el objeto ImgResultante al PictureBox, para ver el análisis en la pantalla
PicResultado.Image = ImgResultante;
//Ponemos los valores de las coordenadas último pixel azul en las barras
TrackBarX.Value = UltimoAzulX;
//TrackBarY.Value = 250 - UltimoAzulY;

//return TimMuestreo.Tick;
} //Fin del análisis, en menos de 200ms vendrá otro
}
}
;


Responder
mif
Respuestas: 1095
 Mif
Topic starter
(@mif)
Noble Member
Registrado: hace 20 años

Muchas felicidades Ranganok, ha quedado muy guapi. Veo que tu programa esta detectando mas azules de los que debe, eso es porque debes disminuir la telerancia, ya veras como con eso consigues una definicion muy buena, a pesar de no estar trabajando con una imagen con tanto contraste como las que usaba yo... eso me facilitaba mucho las cosas.
Yo estoy un poco desconectado del tema de VA, pero solo porque estoy haciendo un control pan & tilt con un 16f876 y un par de servos futaba s3003. en cuanto tenga esto andando ya tendre algo a lo que aplicar nuestros avances en V.A.


Responder
Página 38 / 94
Compartir: