opencv - para - seguimiento de la pupila del ojo en un video
video del ojo (3)
Soy uno de los desarrolladores de SimpleCV. Mantenemos una biblioteca de python de código abierto para visión artificial. Puede descargarlo en SimpleCV.org . SimpleCV es ideal para resolver este tipo de problemas pirateando la línea de comandos. Pude extraer al alumno en solo un par de líneas de código. Aqui tienes:
img = Image("eye4.jpg") # load the image
bm = BlobMaker() # create the blob extractor
# invert the image so the pupil is white, threshold the image, and invert again
# and then extract the information from the image
blobs = bm.extractFromBinary(img.invert().binarize(thresh=240).invert(),img)
if(len(blobs)>0): # if we got a blob
blobs[0].draw() # the zeroth blob is the largest blob - draw it
locationStr = "("+str(blobs[0].x)+","+str(blobs[0].y)+")"
# write the blob''s centroid to the image
img.dl().text(locationStr,(0,0),color=Color.RED)
# save the image
img.save("eye4pupil.png")
# and show us the result.
img.show()
Entonces, sus siguientes pasos son usar algún tipo de rastreador, como un filtro de Kalmann, para rastrear a la pupila de manera robusta. Es posible que desee modelar el ojo como una esfera y seguir el centroide de la pupila en coordenadas esféricas (es decir, theta y phi). También querrá escribir un poco de código para detectar los eventos de parpadeo, por lo que el sistema no funcionará cuando el usuario parpadee. Sugiero usar un detector de borde astuto para encontrar las líneas horizontales más grandes en la imagen y asumiendo que esas son las tapas de los ojos. Espero que esto ayude y, por favor, háganos saber cómo avanza su trabajo.
Estoy trabajando en un proyecto destinado a seguir la pupila del ojo . Para esto he creado un sistema montado en la cabeza que captura las imágenes del ojo. Completado con la porción de hardware me golpeó en la parte de software . Estoy usando opencv . Por favor, hágame saber cuál sería la forma más eficiente de rastrear al alumno. Houghcircles no funcionó bien.
Después de eso, también he intentado con el filtro HSV y aquí está el código y el enlace a la captura de pantalla de la imagen cruda y procesada. Por favor, ayúdame a resolver este problema. El enlace también contiene un video de pupila ocular que estoy usando en este código.
Código:
include "cv.h"
include"highgui.h"
IplImage* GetThresholdedImage(IplImage* img)
{
IplImage *imgHSV=cvCreateImage(cvGetSize(img),8,3);
cvCvtColor(img,imgHSV,CV_BGR2HSV);
IplImage *imgThresh=cvCreateImage(cvGetSize(img),8,1);
cvInRangeS(imgHSV,cvScalar(0, 84, 0, 0),cvScalar(179, 256, 11, 0),imgThresh);
cvReleaseImage(&imgHSV);
return imgThresh;
}
void main(int *argv,char **argc)
{
IplImage *imgScribble= NULL;
char c=0;
CvCapture *capture;
capture=cvCreateFileCapture("main.avi");
if(!capture)
{
printf("Camera could not be initialized");
exit(0);
}
cvNamedWindow("Simple");
cvNamedWindow("Thresholded");
while(c!=32)
{
IplImage *img=0;
img=cvQueryFrame(capture);
if(!img)
break;
if(imgScribble==NULL)
imgScribble=cvCreateImage(cvGetSize(img),8,3);
IplImage *timg=GetThresholdedImage(img);
CvMoments *moments=(CvMoments*)malloc(sizeof(CvMoments));
cvMoments(timg,moments,1);
double moment10 = cvGetSpatialMoment(moments, 1, 0);
double moment01 = cvGetSpatialMoment(moments, 0, 1);
double area = cvGetCentralMoment(moments, 0, 0);
static int posX = 0;
static int posY = 0;
int lastX = posX;
int lastY = posY;
posX = moment10/area;
posY = moment01/area;
// Print it out for debugging purposes
printf("position (%d,%d)/n", posX, posY);
// We want to draw a line only if its a valid position
if(lastX>0 && lastY>0 && posX>0 && posY>0)
{
// Draw a yellow line from the previous point to the current point
cvLine(imgScribble, cvPoint(posX, posY), cvPoint(lastX, lastY), cvScalar(0,255,255), 5);
}
// Add the scribbling image and the frame...
cvAdd(img, imgScribble, img);
cvShowImage("Simple",img);
cvShowImage("Thresholded",timg);
c=cvWaitKey(3);
cvReleaseImage(&timg);
delete moments;
}
//cvReleaseImage(&img);
cvDestroyWindow("Simple");
cvDestroyWindow("Thresholded");
}
Puedo rastrear el ojo y encontrar las coordenadas del centro de la pupila con precisión.
Primero escogí la imagen tomada por la cámara montada en la cabeza. Después de eso, he usado el algoritmo de búsqueda de contorno, luego encuentro el centroide de todos los contornos. Esto me da las coordenadas del centro de la pupila del ojo, este método funciona bien en tiempo real y también detecta el parpadeo de los ojos con muy buena precisión.
Ahora, mi objetivo es incorporar esta característica en un juego (un juego de carreras). En el cual si miro hacia la izquierda / derecha, entonces el carro se mueve hacia la izquierda / derecha y si parpadeo, el carro se ralentiza. ¿Cómo podría proceder ahora? ¿Necesitaría un motor de juego para hacer eso?
Escuché de algunos motores de juegos de código abierto compatibles con visual studio 2010 (unity etc.). ¿Es factible? Si es así, ¿cómo debo proceder?
Esta es mi solución, puedo rastrear el ojo y encontrar las coordenadas del centro de la pupila con precisión.
Primero escogí la imagen tomada por la cámara montada en la cabeza. Después de eso, he usado el algoritmo de búsqueda de contorno, luego encuentro el centroide de todos los contornos. Esto me da las coordenadas del centro de la pupila del ojo, este método funciona bien en tiempo real y también detecta el parpadeo de los ojos con muy buena precisión.
Todo depende de qué tan bueno debe ser tu sistema. Si se trata de un proyecto universitario de dos meses, está bien buscar y rastrear algunos blobs o utilizar una solución ya hecha, como recomendó Kscottz.
Pero si tu objetivo es tener un sistema más serio, debes ir más profundo.
Un enfoque que recomiendo es detectar los puntos de interés facial. Un buen ejemplo son los modelos de apariencia activa, que parece ser el mejor en el seguimiento de caras
y
http://www.youtube.com/watch?v=M1iu__viJN8
Requiere una sólida comprensión de los algoritmos de visión por computadora, buenas habilidades de programación y algo de trabajo. Pero los resultados valdrán la pena el esfuerzo.
Y no se deje engañar por el hecho de que las demostraciones muestran un seguimiento completo. Puedes entrenarlo para seguir cualquier cosa: manos, ojos, flores u hojas, etc.
(Antes de comenzar con AAM, es posible que desee leer más sobre otros algoritmos de seguimiento facial. Pueden ser mejores para usted)