ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Comparar imagem .jpg
Ir à página 1, 2, 3, 4, 5  Próximo
 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
kaborne
Novato
Novato


Registrado: Sábado, 15 de Outubro de 2005
Mensagens: 29

MensagemEnviada: Dom Out 03, 2010 9:29 pm    Assunto: Comparar imagem .jpg Responder com Citação

Gostaria de saber como fazer para comparar 2 imagens .jpeg e se elas são iguais ou não.

Mas se 90% da imagem for igual já poderia dizer que a imagem é igual.. Não sei se isso é possivel.

Estou dizendo isso pq uma imagem pode ser um pouco maior(Em Tamanho) que a outra mas o conteúdo pode ser igual ou não.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Dom Out 03, 2010 10:04 pm    Assunto: Re: Comparar imagem .jpg Responder com Citação

kaborne escreveu:
Gostaria de saber como fazer para comparar 2 imagens .jpeg e se elas são iguais ou não.

Mas se 90% da imagem for igual já poderia dizer que a imagem é igual.. Não sei se isso é possivel.

Estou dizendo isso pq uma imagem pode ser um pouco maior(Em Tamanho) que a outra mas o conteúdo pode ser igual ou não.
Vc quer comparar o canvas da imagem ou o tamanho? Se for a primeira opção, eu acho que ainda tenho a solução, ja a segunda eu não sei como fazer.
_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
kaborne
Novato
Novato


Registrado: Sábado, 15 de Outubro de 2005
Mensagens: 29

MensagemEnviada: Dom Out 03, 2010 10:09 pm    Assunto: Responder com Citação

Gostaria de comparar o Canvas da imagem
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Dom Out 03, 2010 10:36 pm    Assunto: Responder com Citação

kaborne escreveu:
Gostaria de comparar o Canvas da imagem


Olha fiz uma funçãozinha aqui para comparar imagens BMP que realmente são diferentes uma da outra, não funciona se for tamanho diferente entre a mesma imagem

Código:
function TForm1.ImagensDiferentes(img1, img2: TBitmap): boolean;
var
  i, j : integer;
begin

  if (img1.Width <> img2.Width) or (img1.Height <> img2.Height) then
  begin
    Result := False;
    Exit;
  end;

  Result := True;

  for i := 0 to img1.Height-1 do
   for j := 0 to img1.Width-1 do
    if img1.Canvas.Pixels[j,i] <> img2.Canvas.Pixels[j,i] then
    begin
      Result := False;
      Break;
   end;
end;



Usei dois componentes TImage para colocar dois imagens BMP e comparar..

Código:
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  if ImagensDiferentes( Image1.Picture.Bitmap , Image2.Picture.Bitmap ) then
     Showmessage('As imagens são iguais')
  else
     Showmessage('As imagens são diferentes');
end;


Vc pode melhorar a função..
_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
johnny-walker
Moderador
Moderador


Registrado: Sábado, 4 de Outubro de 2003
Mensagens: 10653
Localização: Contagem/MG - BRAZIL

MensagemEnviada: Seg Out 04, 2010 12:28 pm    Assunto: Responder com Citação

Se forem o mesmo arquivo vc pode utilizar md5, caso contrário vc teria de utilizar inteligência artificial para resolver esta questão com bibliotecas de reconhecimento facial de imagem e outros detalhes...

bye
_________________
P.O.W.E.R B.Y D.E.L.P.H.I
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
kaborne
Novato
Novato


Registrado: Sábado, 15 de Outubro de 2005
Mensagens: 29

MensagemEnviada: Seg Out 04, 2010 6:41 pm    Assunto: Responder com Citação

johnny-walker escreveu:
Se forem o mesmo arquivo vc pode utilizar md5, caso contrário vc teria de utilizar inteligência artificial para resolver esta questão com bibliotecas de reconhecimento facial de imagem e outros detalhes...

bye



Vou explicar o que quero fazer para ficar mais fácil de visualizar.

Eu tenho 2 imagens que quero comparar. Uma que é sempre a mesma imagem e é colocada em um TImage. O outro TImage fica atualizando a imagem a cada 1 segundo com a imagem do desktop(Um Print Screen). Assim teria que comparar essas duas imagens a cada 1 segundo falando se são iguais ou diferentes.

A rotina do Adriano, ela sempre está falando que as imagens são iguais e o mais interessante e que depois da comparação as imagens somem da tela. Não sei o que pode estar acontecendo.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
gilsonnrodrigues
Moderador
Moderador


Registrado: Quinta-Feira, 14 de Abril de 2005
Mensagens: 9009
Localização: Governador Valadares-MG

MensagemEnviada: Ter Out 05, 2010 9:29 am    Assunto: Responder com Citação

kaborne escreveu:

A rotina do Adriano, ela sempre está falando que as imagens são iguais e o mais interessante e que depois da comparação as imagens somem da tela. Não sei o que pode estar acontecendo.


img1.Canvas.Pixels

força a imagem q está em picture para um tipo Tbitmap, se não for ele vai virar um Bitmap em branco.

dai a igualdade.

mas tem solução.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
strak2012
Colaborador
Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014
Mensagens: 1518
Localização: Maceió - AL

MensagemEnviada: Ter Jan 14, 2014 1:20 pm    Assunto: Responder com Citação

use tolerância em vez de
Código:
if img1.Canvas.Pixels[j,i] <> img2.Canvas.Pixels[j,i] then

procure fazer
Código:
if abs(img1.Canvas.Pixels[j,i]-img2.Canvas.Pixels[j,i])<10 then


desta forma consegue ver quantos % uma imagem é igual a outra.

resultado seria

Código:
function TForm1.ImagensDiferentes(img1, img2: TBitmap): byte;
var
  i, j : integer;
  c:longint;
begin
  c:=0;   
  for i := 0 to img1.Height-1 do
   for j := 0 to img1.Width-1 do
   if abs(img1.Canvas.Pixels[j,i]-img2.Canvas.Pixels[j,i])<10 then
      inc(c);
   result:=round(c/(img1.Height*img1.Width)*100); // retorna quanto % as imagem são semelhante
end;


se o retorno for 100 indica que ela são semelhante com uma tolerância de 10 cores para mais ou menos em cada ou varios pixels


Editado pela última vez por strak2012 em Dom Jan 26, 2014 10:37 pm, num total de 1 vez
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
claudio.ferreira
Profissional
Profissional


Registrado: Quarta-Feira, 18 de Setembro de 2013
Mensagens: 667

MensagemEnviada: Ter Jan 14, 2014 2:47 pm    Assunto: Responder com Citação

Fantastica a solução do strak2012, já guardei na lib de rotinas.
_________________
Sistema SNGPC para farmácias
http://www.cmasistemas.com.br
Rastreabilidade de Medicamentos
https://www.sncm.com.br
Soluções em Delphi
https://delphisolutions.wordpress.com/
.
"E não sabendo que era impossível, foi lá e fez"
Mark Twain
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Visitar a homepage do Usuário
strak2012
Colaborador
Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014
Mensagens: 1518
Localização: Maceió - AL

MensagemEnviada: Seg Jan 20, 2014 11:52 am    Assunto: Responder com Citação

afim de deixar este assunto ainda mais completo vai uma rotina preparada e otimizada para o mesmo fim, desta vez tomando em conta que a comparação será realizada em cima do rgb de cada pixels, isso fará com que a tolerância não seja mais no numero da cor e sim no numero de cada pigmento rgb de cada pixels. foi também usado o nosso amigo ScanLine para tonar o processo de comparação ainda mais veloz, reduzindo significantemente o tempo de todo o processo.

assim sendo este é o resultado.
Código:
function semelhanca(tol: byte; img1, img2: TImage): real;
type
  TRGB32 = packed record
    B, G, R, A: Byte;
  end;
  TRGB32Array = packed array[0..MaxInt div SizeOf(TRGB32)-1] of TRGB32;
  PRGB32Array = ^TRGB32Array;
var
  x, y: Integer;
  TolOk: boolean;
  cnt: longint;
  abmp: Tbitmap;
  linha1,linha2 : PRGB32Array;
begin
  cnt := 0;

  { cria abmp na memoria }
  abmp := Tbitmap.Create;
  { para caso a imagem no img1 não seja do tipo bmp que seja feita a conversão }
  { converte a imagem em img1 em bmp e depois devolve para img1 }
  abmp.Width := img1.Width;
  abmp.Height := img1.Height;
  abmp.Assign(img1.Picture.Graphic);
  img1.Picture.Bitmap.Assign(abmp);
  { para caso a imagem no img2 não seja do tipo bmp que seja feita a conversão }
  { converte a imagem em img2 em bmp e depois devolve para img2 }
  abmp.Width := img2.Width;
  abmp.Height := img2.Height;
  abmp.Assign(img2.Picture.Graphic);
  img2.Picture.Bitmap.Assign(abmp);
  { liberta abmp da memoria }
  abmp.Free;

  {loop de compração}
  for y := 0 to img1.Height - 1 do
  begin
  linha1:=img1.Picture.Bitmap.ScanLine[y];// busca uma linha em img1
  linha2:=img2.Picture.Bitmap.ScanLine[y];// busca uma linha em img2
    for x := 0 to img1.Width - 1 do
    begin
      TolOk := true;
      if TolOk then TolOk := abs(linha1[x].R-linha2[x].R)<tol; // se verdadeiro tem pigmento vermelho com tolerancia desejada
      if TolOk then TolOk := abs(linha1[x].G-linha2[x].G)<tol; // se verdadeiro tem pigmento verde com tolerancia desejada
      if TolOk then TolOk := abs(linha1[x].B-linha2[x].B)<tol; // se verdadeiro tem pigmento azul com tolerancia desejada
      if TolOk then inc(cnt); // se verdadeiro soma +1 como sendo os pixels em img1[x,y] e img2[x,y] sendo semelhente
    end;
  end;

  {resultado}
  result := cnt / (img1.Height * img1.Width) * 100; // retorna quanto % as imagem são semelhante
end;


dos exemplo de uso mais comum seria
Código:
Label1.Caption := formatfloat('0.00',semelhanca(10, Image1, Image2));


meu teste



Editado pela última vez por strak2012 em Dom Mar 09, 2014 8:08 pm, num total de 2 vezes
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
claudio.ferreira
Profissional
Profissional


Registrado: Quarta-Feira, 18 de Setembro de 2013
Mensagens: 667

MensagemEnviada: Seg Jan 20, 2014 11:57 am    Assunto: Responder com Citação

Parabéns strak2012.
O que já era bom, melhorou.

Show !
_________________
Sistema SNGPC para farmácias
http://www.cmasistemas.com.br
Rastreabilidade de Medicamentos
https://www.sncm.com.br
Soluções em Delphi
https://delphisolutions.wordpress.com/
.
"E não sabendo que era impossível, foi lá e fez"
Mark Twain
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Visitar a homepage do Usuário
claudio.ferreira
Profissional
Profissional


Registrado: Quarta-Feira, 18 de Setembro de 2013
Mensagens: 667

MensagemEnviada: Seg Jan 20, 2014 12:05 pm    Assunto: Responder com Citação

Aplicações com reconhecimento facial com margem de tolerância podem ser usadas com a sua rotina.

Banco de imagens evitando duplicidade podem ser realizados e inúmeras outras aplicações, basta um pouco de criatividade.

Muito bom.
_________________
Sistema SNGPC para farmácias
http://www.cmasistemas.com.br
Rastreabilidade de Medicamentos
https://www.sncm.com.br
Soluções em Delphi
https://delphisolutions.wordpress.com/
.
"E não sabendo que era impossível, foi lá e fez"
Mark Twain
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Visitar a homepage do Usuário
strak2012
Colaborador
Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014
Mensagens: 1518
Localização: Maceió - AL

MensagemEnviada: Seg Jan 20, 2014 12:22 pm    Assunto: Responder com Citação

sim existe n fins para qual esta rotina pode ser usado, já para reconhecimento facial, requer o uso triangulação assim como também recortes das duas imagens, normalmente é feito em escala cinza com triangulação e uma sobreposta a outra. neste caso seria

Código:

r:=linha1[x].R+linha2[x].R div 2;
if (r '>=' 128-tol) and (r '<=' 128-tol) then // r em img1 e img2 são semelhante

G:=linha1[x].G+linha2[x].G div 2;
if (g '>=' 128-tol) and (g '<=' 128-tol) then // r em img1 e img2 são semelhante

b:=linha1[x].B+linha2[x].B div 2;
if (b '>=' 128-tol) and (b '<=' 128-tol) then // r em img1 e img2 são semelhante



claro que ambas as imagens em escala cinza para eliminar a enumera variação de cor, luz e sombra que possa haver.

a triangulação servira apenas para conseguir posicionar a cabeça em ambas a imagens na mesma coordenada para facilitar a comparação e a exatidão do reconhecimento facial


Editado pela última vez por strak2012 em Dom Jan 26, 2014 10:39 pm, num total de 1 vez
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
claudio.ferreira
Profissional
Profissional


Registrado: Quarta-Feira, 18 de Setembro de 2013
Mensagens: 667

MensagemEnviada: Seg Jan 20, 2014 12:30 pm    Assunto: Responder com Citação

Nesse caso como voce dissse que seria um pouco diferente, teria como voce adaptar essa e postaruma rotina especifica para reconhecimento facial
?

voce tem um conhecimento bom nessa área onde poucas pessoas tem.
_________________
Sistema SNGPC para farmácias
http://www.cmasistemas.com.br
Rastreabilidade de Medicamentos
https://www.sncm.com.br
Soluções em Delphi
https://delphisolutions.wordpress.com/
.
"E não sabendo que era impossível, foi lá e fez"
Mark Twain
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Visitar a homepage do Usuário
strak2012
Colaborador
Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014
Mensagens: 1518
Localização: Maceió - AL

MensagemEnviada: Seg Jan 20, 2014 12:50 pm    Assunto: Responder com Citação

quanto a comparação das imagens não é o problema. na maioria das vezes o problema estar em dois fatores

1º posicionar a cabeças em ambas as imagens na mesma coordenada uma vez que exista plano de fundo na imagens, requer então detecção de bordas para conseguir isolar apenas as cabeças.

2º as cabeças pode não estar no mesmo ângulo tipo uma estar olhando direto para câmera e outra um pouco de lado isso já nos dá mais complicações.

até o presente momento não descobrir uma rotina 100% funcional em reconhecimento facial, os melhores estaria no que usa rotinas 3d para compensar esta diferença de ângulo das cabeças nas duas imagens.

já para cadastro de fotos onde se pode ter uma tela limpa no fundo e onde se pode pedi para quem terá a foto cadastrado que olhes para um determinado local é provável que a rotina funcione com as alterações que citei anteriormente.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Ir à página 1, 2, 3, 4, 5  Próximo
Página 1 de 5

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB