Get Even More Visitors To Your Blog, Upgrade To A Business Listing >>

Reconocimiento facial con Delphi Tokyo 10.2.2

Hace unos días me pidieron que hiciese un programa de Reconocimiento Facial para identificar a los alumnos de una escuela.
Dándole vueltas al tema me di cuenta que tenía que dividirlo en dos partes, la primera sería la extracción de la cara del alumno de la imagen inicial eliminando el fondo y la segunda la del tratamiento de esa imagen para identificar al alumno en cuestión utilizando técnicas de inteligencia artificial.
Inicialmente pensé en utilizar OpenCV (aquí tienen cómo instalarlo), pero por más intentos que hice  no conseguí que funcionase en mi equipo, me decía que no encontraba unas dlls, o que "no era una aplicación win32 válida", así que investigando en Google encontré que Android tiene incorporado un objeto llamado JFaceDetector para hacer reconocimiento facial, que lo podemos utilizar desde la unit Androidapi.JNI.Media.
Para utilizarlo se hace de la siguiente forma:
Desde nuestro Delphi Tokyo 10.2.2 accedo a File - Multi-Device Application y creo un nuevo proyecto.
En el form incorporo desde la "Tool Palette", un tButton, tLabel, tImage.
En la tImage cargo la imagen de prueba, para que quede de la siguiente forma:


En el componente Label1 mostraremos el número de caras que ha detectado el programa.
y dentro del tbutton en el evento Onclic colocaremos el siguiente código:


procedure TForm12.Button1Click(Sender: TObject);
var
LDetector: JFaceDetector;
LFaces: TJavaObjectArray;
LFace: JFaceDetector_Face;
LSurface: TBitmapSurface;
LBitmap: JBitmap;
LMidpoint: JPointF;
LFaceCount, I: Integer;
LRect: TRectF;
LHalfWidth: Single;

begin

LSurface := TBitmapSurface.Create;
try
LSurface.Assign(FaceImage.Bitmap);
LBitmap := TJBitmap.JavaClass.createBitmap(LSurface.Width, LSurface.Height,
TJBitmap_Config.JavaClass.ARGB_8888);
SurfaceToJBitmap(LSurface, LBitmap);
LMidpoint := TJPointF.Create;
LFaces := TJavaObjectArray.Create(10);
LDetector := TJFaceDetector.JavaClass.init(LBitmap.getWidth,
LBitmap.getHeight, 10);
LFaceCount := LDetector.findFaces
(LBitmap.copy(TJBitmap_Config.JavaClass.RGB_565, False), LFaces);
Label1.Text := LFaceCount.ToString + 'caras';
for I := 0 to LFaceCount - 1 do
begin
LFace := LFaces.Items[I];
LFace.getMidPoint(LMidpoint);
LHalfWidth := LFace.eyesDistance * 2;
LRect := RectF(LMidpoint.x - LHalfWidth, LMidpoint.y - LHalfWidth,
LMidpoint.x + LHalfWidth, LMidpoint.y + LHalfWidth);
FaceImage.Bitmap.Canvas.BeginScene;
try
FaceImage.Bitmap.Canvas.Stroke.Color := TAlphaColorRec.Red;
FaceImage.Bitmap.Canvas.Stroke.Thickness := 2;
//FaceImage.Bitmap.Canvas.DrawEllipse(LRect, 1);
FaceImage.Bitmap.Canvas.DrawRect(LRect,0,0,allcorners, 100);
finally
FaceImage.Bitmap.Canvas.EndScene;
end;
end;
finally
LSurface.Free;
end;
end;



y a continuación ejecutamos el código y veremos cómo nos ha creado un rectángulo rodeando los rostros que ha detectado:



En próximos artículos publicaré cómo utilizar redes neuronales para la identificación de imágenes.
Bueno, pues espero que les haya sido útil este post.


Javier Pareja




También les puede interesar:
Reconocimiento de caras
Seguimiento de personas,animales y objetos con Delphi




This post first appeared on Delphi Magic, please read the originial post: here

Share the post

Reconocimiento facial con Delphi Tokyo 10.2.2

×

Subscribe to Delphi Magic

Get updates delivered right to your inbox!

Thank you for your subscription

×