Clique para saber mais...
  Home     Download     Produtos / Cursos     Revista     Vídeo Aulas     Fórum     Contato   Clique aqui para logar | 07 de Junho de 2026
  Login

Codinome
Senha
Salvar informações

 Esqueci minha senha
 Novo Cadastro

  Usuários
30 Usuários Online

  Revista ActiveDelphi
 Assine Já!
 Edições
 Sobre a Revista

  Conteúdo
 Apostilas
 Artigos
 Componentes
 Dicas
 News
 Programas / Exemplos
 Vídeo Aulas

  Serviços
 Active News
 Fórum
 Produtos / Cursos

  Outros
 Colunistas
 Contato
 Top 10

  Publicidade

  [Dicas]  Reconhecimento Facial em Delphi - Agora ficou mais fácil
Publicado por patrix : Quinta, Dezembro 20, 2012 - 08:22 GMT-3 (2233 leituras)
Comentários 9 Comentários   Enviar esta notícia a um amigo Enviar para um amigo   Versão para Impressão Versão para impressão
Administrador Bom pessoal, podia estar roubando, matando ou vendendo o código, mas decidi postar gratuitamente para que vc´s EVOLUAM em um
ser de luz :D . Serei rápido e objetivo e o resto é com vcs. Peço apenas para quem compartilhar, não esquecer dos créditos. Segue a base para trabalhar com reconhecimento facial em Delphi:

Baixe os PAS e dll´s: Math,IPL, OpenCV, OpenCV_CV, OpenCV_CXCORE, OpenCV_HighGUI, etc...

Disponibilizei em http://www.4shared.com/file/9zY0Kevb/OPENCV.html

Segue o código.



{*******Desenvolvido por Patrick Grosch patrick@datasulbr.com - baseado na biblioteca OPENCV 2010***********}

unit unitrec;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls,Math,IPL, OpenCV, frmHistogram, jpeg, OpenCV_CV, OpenCV_CXCORE, OpenCV_HighGUI,
StdCtrls;

type
TForm1 = class(TForm)
Image1: TImage;
Timer1: TTimer;
Label1: TLabel;
Label2: TLabel;
Bevel1: TBevel;

procedure Timer1Timer(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure servoxTimer(Sender: TObject);
private
Capture: PCvCapture;
Storage: PCvMemStorage;
Xml: string;
Cascade2: PCvHaarClassifierCascade;


{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
BinArr: array of Byte;
calculax,tempx,tempposx,tempposy,calculay:integer;


i, bin_w: integer;
_vmin, _vmax: integer;
max_val: float;
val: integer ;
cs: CvSize;
rec: TRect;

{-----------------------}
image: pIplImage = nil;
hsv: pIplImage = nil;
hue: pIplImage = nil;
mask: pIplImage = nil;
backproject: pIplImage = nil;
histimg: pIplImage = nil;
hist: PCvHistogram = nil;

backproject_mode: longint = 0;
select_object: longint = 0;
track_object: longint = 0;
show_hist: longint = 0;

origin: CvPoint;
selection: CvRect;
track_window: CvRect;
track_box: CvBox2D;
track_comp: CvConnectedComp;

hdims: longint = 16;


hranges_arr: array[0..1] of float = (0, 180);
hranges: Pfloat = @hranges_arr;

capture: PCvCapture;
frame: PIplImage;
color: CvScalar;
bmp: TBitmap;

cr: TRect;
r: PCvRect;
faces: PCvSeq;

pt1, pt2: TCvPoint2D32f;


{-----------------------------}

sector_data : array[0..5] of array[0..2] of longint =
((0,2,1), (1,2,0), (1,0,2), (2,0,1), (2,1,0), (0,1,2));

{*************************************************************************}
implementation

{$R *.dfm}


function hsv2rgb(hue: float ): CvScalar ;
var
rgb : array[0..2] of longint;
p, sector: longint;
// sector_data : array[0..5] of array[0..2] of longint;
begin
hue := hue * 0.033333333333333333333333333333333;
sector := cvFloor(hue);
p := cvRound(255*(hue - sector));
if (sector and 1) <> 0 then
p := p xor 255
else
p := p xor 0;

rgb[sector_data[sector][0]] := 255;
rgb[sector_data[sector][1]] := 0;
rgb[sector_data[sector][2]] := p;

result := cvScalar_(rgb[2], rgb[1], rgb[0], 0);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
conta:integer;

begin
frame := cvQueryFrame( capture );
if not(assigned(frame) ) then
exit;

if not(assigned(image) ) then
begin
//Aloca em buffer
cs.width := frame.Width;
cs.height := frame.Height;
image := cvCreateImage( cs, 8, 3 );

image.Origin := frame.Origin;
hsv := cvCreateImage( cs, 8, 3 );
hue := cvCreateImage( cs, 8, 1 );
mask := cvCreateImage( cs, 8, 1 );
backproject := cvCreateImage( cs, 8, 1 );
hist := cvCreateHist( 1, @hdims, CV_HIST_ARRAY, @hranges, 1 );
histimg := cvCreateImage( cvSize_(320,200), 8, 3 );
cvZero( histimg );
end;

cvCopy( frame, image, nil );
cvCvtColor( image, hsv, CV_BGR2HSV );


frame := cvQueryFrame(Capture);
if not Assigned(frame) then Exit;



{visualize a câmera na janela}
IplImage2Bitmap(image, bmp);
rec := image1.canvas.ClipRect;
image1.canvas.StretchDraw(rec , bmp);

cvClearMemStorage(Storage);

faces := cvHaarDetectObjects(frame, Cascade2, Storage, 1.2, 2,CV_HAAR_DO_CANNY_PRUNING, CvSize_(40, 40));

IplImage2Bitmap(frame, bmp);

bmp.Canvas.Pen.Color := clRed;
bmp.Canvas.Pen.Width := 3;
bmp.Canvas.Brush.Style:= bsClear;

for i := 0 to Faces.total - 1 do begin
r := PCvRect(cvGetSeqElem(Faces, i));
pt1.x := r.x;
pt2.x := r.x + r.width;
pt1.y := r.y;
pt2.y := r.y + r.height;

if Faces.total>0 then
begin
for conta:=1 to Faces.total do
Bmp.Canvas.Rectangle(Round(pt1.x),Round(pt1.y), Round(pt2.x), Round(pt2.y));

if r.x>160 then
calculax:=abs((r.x-tempposx)-tempx) else
calculax:=abs((r.x+tempposx)+tempx);

tempposx:=r.x;

end else
//calculax:=84;
end;

cr := Image1.Canvas.ClipRect;
Image1.Canvas.StretchDraw(cr, Bmp);


{ if (show_hist <> 0) then
begin
IplImage2Bitmap(histimg, bmp);
fHistogram.histimage.canvas.StretchDraw(fHistogram.histimage.canvas.ClipRect , bmp);

end;}


end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Storage := cvCreateMemStorage(0);
Xml := 'haarcascade_frontalface_alt.xml';
Cascade2 := PCvHaarClassifierCascade(cvLoad(PChar(Xml), nil, nil, nil ));
capture := cvCreateCameraCapture(0);

if not(assigned(capture )) then
begin
MessageDlg('Could not initialize capturing from camera!!', mtError, [mbOK], 0);
halt;
end;


bmp := TBitmap.Create;
bmp.PixelFormat := pf24bit;



timer1.enabled := true;

end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
cvReleaseCapture(@Capture);
FreeAndNil(Bmp);
if assigned(fHistogram) then
fHistogram.Destroy;

end;
{*******Desenvolvido por Patrick Grosch patrick@datasulbr.com - baseado na biblioteca OPENCV 2010***********}




end.


Comentários Comentários
   Ordem:  
Comentários pertencem aos seus respectivos autores. Não somos responsáveis pelo seus conteúdos.


por: marcoantoneo (marco@pgm.com.br) : Dez 20, 2012 - 09:01
(Informações sobre o membro | Enviar uma mensagem)
Bom dia. Obrigado pelo compartilhamento do conhecimento.
Mas o link pra baixar esta dando como inválido:
"Invalid link
The file link that you requested is not valid ;( "


por: siro (siro@bol.com.br) : Dez 20, 2012 - 09:04
(Informações sobre o membro | Enviar uma mensagem) http://
Link não funciona.


por: EliomarOffice (eliomar0910@gmail.com) : Dez 20, 2012 - 09:51
(Informações sobre o membro | Enviar uma mensagem)
Podem baixar os fontes direto da fonte hehehe
http://opencvdelphi.googlecode.com/svn/trunk/


por: EliomarOffice (eliomar0910@gmail.com) : Dez 20, 2012 - 10:57
(Informações sobre o membro | Enviar uma mensagem)
é não consegui fazer funcionar não... da erro sempre, win7 64 bits; estranho que pegando o exe que esta dentro da pasta bin, dos fontes: http://opencvdelphi.googlecode.com/svn/trunk/demos/camshiftdemo/bin
camshiftdemo.exe pelo menos mostra a imagem e tal se eu compilar ai não funciona mais.
Alguém conseguiu fazer funcionar?
  Edição 112

Revista ActiveDelphi

  50 Programas Fontes


  Produtos

Conheça Nossos Produtos

Copyright© 2001-2016 – Active Delphi – Todos os direitos reservados