Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:
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
De nada furri!
Las cámaras con pretensiones de funcionar con niveles muy bajos de iluminación, y que suelen estar equipadas con iluminadores de IR, normalmente no llevan filtros ese espectro de luz y si tenéis alguna, puede que en condiciones de luz solar, estén completamente saturadas y aparezcan imágenes carentes de contraste y "quemadas" con un brillo excesivo.
Bueno, ahi va un ejemplito de como lo hago, de todas formas el programa es más largo y tiene un pequeño trabajito de preparar previamente las zonas de memoria, etc.
//estructura que define los tres bytes del color rgb
typedef struct{
BYTE b,g,r;
}COL;
COL colorr;
COL color;
COL *des;
COL *punt, *puntdes;
int r1,g1,b1;
capGrabFrame(hWndC);
HDC origen = GetDC(hWndC);
//borro del buffer de destino
memset(Captura.punt.lpIndex,0,320*240*3);
//copio la imagen capturada al buffer
BitBlt(hdcCaptura, 0, 0, 320, 240, origen, 0, 0, SRCCOPY);
//puntero a la imagen de origen
punt = (COL*)Captura.punt.lpIndex;
//puntero a la imagen de destino
puntdes = (COL*)Destino.punt.lpIndex;
int po = Barra->Position;
int val = Barra2->Position;
if(Efectos->Checked)
{
for(int fila=239; fila>-1; fila--)
{
des = (COL*)BitImage->ScanLine[fila];
for(int col=0; col<320; col++)
{
//antes usaba esto: colordc = GetPixel(origen,col,fila);
//obtengo el primer byte de color
color = *punt++;
r1 = color.r;
g1 = color.g;
b1 = color.b;
//tratamiento de la imagen para modificarla
if(r1<po>po) r1+=val;
if(g1<po>po) g1+=val;
if(b1<po>po) b1+=val;
colorr.r = r1;
colorr.g = g1;
colorr.b = b1;
//el puntero de destino obtiene los datos variados
*des++ = colorr;
*puntdes++ = colorr;
}
}
//y vuelco la imagen en un control de la pantalla, sin parpadeos
imagen->Canvas->CopyMode = cmSrcCopy;
imagen->Canvas->Draw(0,0,BitImage);
}
En cuanto pueda os pongo un ejemplo completo y funcionando con cualquier cámara, ya sea web o a través de capturadora.
Perdonad, que he estado un par de dias un poco off, pero ha sido por una buena causa... ¡¡¡mi sistema ya se empieza a mover!!!
Gracias a algunas correcciones en el calculo de la posicion de la camara, y muchas correcciones en el sistema de comunicacion Serie... la camara empieza a seguir el azul... ¡que guapo!
Evidentemente me queda mucho por refinar, y como bien dice eventronic, deberia empezar a pasarme a C, pq esto empiezo a ver que se me queda corto, pero me temo que eso no va a ser tan facil.
Mi camara quema btte las imagenes cuando la luz es irregular, y el balance de blancos no lo hace tan bien como la webcam con la que emece con esto, asi que son cosas a corregir estos dias... espero poder poneros un video chulo mañana mismo... podrá TupperBot dar vueltas en busca de mi baliza azul?
Para quienes conozcais este mundo os debe sonar a tonteria, pero es muy emocionante ver como esto que me ha llevado meses desarrollarlo, empieza a dar sus frutos...
Proximamente el programa completo de V.A., y un tutorial que lo acompañe.
Hola de nuevo
En la línea en la que estoy trabajando, no solo me interesa detectar un color determinado, sino cualquier objeto que se mueva por la imagen, sea cual sea su color. Si observas la captura, la ventana me muestra el boli, que es lo unico que ha cambiado con respecto al fondo. El programa corrige las variaciones de luz y brillo que afectan a la imagen en general.
Lo tengo realizado en Borland C++ y aunque lo hice hace varios años, lo he retomado para la visión de un robot comercial que estoy realizando.
El funcionamiento es el siguiente:
1º.- Capturo la imagen y la guardo en un buffer de memoria.
2º.- Divido la imagen en 600 pequeños recuadros de 20x20 pixel. Cada recuadro forma en si un 'macropixel' siendo el resultado de la media de color de los 20x20. Esta imagen mas pequeña la almaceno.
¿Porqué hago esto? para ganar en velocidad de proceso y para minimizar las variaciones de luz propias de los parpadeos de las cámaras y del pequeño efecto nieve que todas tienen.
Al tener la media de 20x20 pixels adyacentes los efectos de parpadeo desaparecen.
3º.- Trabajo sobre la imagen 'reducida', comparando la guardada con las nuevas obtenidas, para ver la variación de luz entre ellas, y si pasan de cierto nivel, actúo en consecuancia, por ejemplo, pinto un recuadro con la imagen original debajo, etc.
4º.- Repito el proceso, almacenando otro nuevo fondo.
Con este sistema detecto la posición de objetos y sus coordenadas, y no dependo del color.
Lógicamente todo esto está aun en pañales y le queda mucho trabajo, es solo una idea distinta en la que trabajar.
Saludos a todos y ánimo Mif.
me parece una linea muy interesante eventronic, y veo que contigo vamos a tener una excelente fuente de informacion. creo que cuando arregle un par de fallitos que tiene mi sistema ahora, me ire pasando a C, porque se que es mucho mas efectivo...
pero no se por cual tirarme... C# o Borland... que opinas?
