Expresate

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

Optimizar Programa ...
 
Avisos
Vaciar todo

Optimizar Programa Visión Artificial

14 Respuestas
5 Usuarios
0 Reactions
6,860 Visitas
ionthas
Respuestas: 153
Topic starter
(@ionthas)
Estimable Member
Registrado: hace 17 años

Buenas a todos.

Estos últimos días he estado haciendo programillas de visión artificial en C#.

Estoy haciendo un programa que me filtre el color rojo y que solo se vea en la imagen un globo de color rojo.

Tengo dos problemas.

El primero es que el rendimiento del programa es nefasto, dibujo un fotograma cada 2 o 3 segundos. Me gustaria saber si hay alguna otra forma de filtrar un color. Yo lo hice pintando los pixels que no sean de color rojo de color negro.


namespace FiltroRGB
{
public partial class FFiltrar : Form
{
public FFiltrar()
{
InitializeComponent();
}

private void BEmpezar_Click(object sender, EventArgs e)
{
WebCam1.Start();
PMuestra.Image = WebCam1.Imagen;
}

private void BParar_Click(object sender, EventArgs e)
{
TMuestreo.Enabled = false;
WebCam1.Stop();
}

private void BFiltrar_Click(object sender, EventArgs e)
{
TMuestreo.Enabled = true;
}

private void TMuestreo_Tick(object sender, EventArgs e)
{
PMuestra.Image = WebCam1.Imagen;

Bitmap ImgOriginal = new Bitmap(PMuestra.Image);
Bitmap ImgFinal = new Bitmap(PMuestra.Image);

int red, green, blue;
int x, y;

for (y = 0; y < ImgOriginal.Height; y++)
{
for (x = 0; x <ImgOriginal> 150 && green < 80 && blue < 80)
{
ImgFinal.SetPixel(x, y, Color.Red);
}
else
{
ImgFinal.SetPixel(x, y, Color.Black);
}
}
}

PMuestra.Image = ImgFinal;

}
}
}

El segundo problema es la calibración de los colores. xD Me estoy volviendo loco para calibrar el rojo, hay alguna forma de poder hacerlo sin tener que poner los valors RGB que quieres filtrar?

(Según lo que he estado leyendo lo ideal sería utilizar punteros en C++, pero de momento prefiero utilizar C#, cuando el rendimiento me esté matando pues me pasaré a C++).

Por último decir que utilizo la libreria WebCAM.dll, hay alguna mejor?¿

Si me podeis ayudar a mejorar el rendimiento de los bucles, o alguna otra forma de hacerlo hos estaria agradecido. 😛

Saludos y gracias.

Responder
13 respuestas
urriellu
Respuestas: 61
(@urriellu)
Trusted Member
Registrado: hace 18 años

Leyendo a jorcoval, se me ocurre que una manera bastante eficiente sería ir recorriendo la imagen de X en X filas y columas, siendo X un la mitad del tamaño (en píxeles) del objeto de menor tamaño que quieras poder reconocer. Por ejemplo si quieres reconocer una pelota roja que sea de al menos 20 pixeles de diámetro (lo que haría un cuadrado 20x20 pixeles), vas recorriendo de 10 en 10 filas y columnas, y cuando encuentres un pixel rojo, entonces desde ahí buscas todos los píxeles periféricos que también sean rojos.

Seguramente sea algo más difícil de programar pero mucho más eficiente.

Responder
ionthas
Respuestas: 153
Topic starter
(@ionthas)
Estimable Member
Registrado: hace 17 años

Buenas.

Mi proyecto de visión artificial ha avanzado mucho desde mi último post, Uriellu pensamos lo mismo, hace unos días lo hice exactamente como lo dijiste.

El programa de momento busca todos los colores que le ponga y va muy fluido. Ahora le haré la opción que dice ragnarok que me pareció interesante.

Una pregunta se recomienda utilizar punteros en C#?¿ He visto que hay pero también que dan problemas.

Saludos.

Responder
urriellu
Respuestas: 61
(@urriellu)
Trusted Member
Registrado: hace 18 años

No los uses, no los necesitas para nada. Los "punteros a objeto" se gestionan automáticamente, por ejemplo si hace "MiClase obj = new MiClase();", "obj" es una referencia a objeto, lo que viene a ser como un puntero, pero no tienes que complicarte la vida con punteros. Por otra parte, si quieres pasar variables como parámetros a funciones y que la función pueda modificar la variable (es decir, lo que en C se haría con un puntero) se hace pasando las variables por referencia, con los keywords "ref" y "out" (cada uno se usa para un caso distinto, aunque si no te quieres complicar ahora que estás empezando con C#, usa siempre "ref").

http://msdn.microsoft.com/en-us/library/14akc2c7(VS.71).aspx

Hay dos casos en los que sí necesitas (o no) punteros:
-Cuando llamas a librerías nativas usando P/Invoke (que dudo mucho que uses)
-Si quieres que cierto objeto almacene la dirección de una variable, por ejemplo le pasas un puntero como parámetro al constructor y quieres que otras funciones de ese objeto puedan trabajar con la variable a la que hace referencia ese puntero, pues entonces necesitas que uno de los fields del objeto sea un puntero. Esto normalmente se hace con delegados o eventos.

Resumen: NO USES PUNTEROS

Si pones tu código y me dices lo que quieres hacer, te digo cual sería la mejor manera sin usar punteros.

Responder
ionthas
Respuestas: 153
Topic starter
(@ionthas)
Estimable Member
Registrado: hace 17 años

Nada, era solo curiosidad.

Muchas gracias Urriellu.

Responder
jorcoval
Respuestas: 418
(@jorcoval)
Reputable Member
Registrado: hace 19 años

Leyendo a jorcoval, se me ocurre que una manera bastante eficiente sería ir recorriendo la imagen de X en X filas y columas, siendo X un la mitad del tamaño (en píxeles) del objeto de menor tamaño que quieras poder reconocer. Por ejemplo si quieres reconocer una pelota roja que sea de al menos 20 pixeles de diámetro (lo que haría un cuadrado 20x20 pixeles), vas recorriendo de 10 en 10 filas y columnas, y cuando encuentres un pixel rojo, entonces desde ahí buscas todos los píxeles periféricos que también sean rojos.

Seguramente sea algo más difícil de programar pero mucho más eficiente.
Exacto, esa era la idea.

Responder
Página 2 / 3
Compartir: