| Exibir mensagem anterior :: Exibir próxima mensagem |
| Autor |
Mensagem |
kaborne Novato

Registrado: Sábado, 15 de Outubro de 2005 Mensagens: 29
|
Enviada: Dom Out 03, 2010 9:29 pm Assunto: Comparar imagem .jpg |
|
|
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 |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Dom Out 03, 2010 10:04 pm Assunto: Re: Comparar imagem .jpg |
|
|
| 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 |
|
 |
kaborne Novato

Registrado: Sábado, 15 de Outubro de 2005 Mensagens: 29
|
Enviada: Dom Out 03, 2010 10:09 pm Assunto: |
|
|
| Gostaria de comparar o Canvas da imagem |
|
| Voltar ao Topo |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Dom Out 03, 2010 10:36 pm Assunto: |
|
|
| 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 |
|
 |
johnny-walker Moderador


Registrado: Sábado, 4 de Outubro de 2003 Mensagens: 10653 Localização: Contagem/MG - BRAZIL
|
Enviada: Seg Out 04, 2010 12:28 pm Assunto: |
|
|
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 |
|
 |
kaborne Novato

Registrado: Sábado, 15 de Outubro de 2005 Mensagens: 29
|
Enviada: Seg Out 04, 2010 6:41 pm Assunto: |
|
|
| 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 |
|
 |
gilsonnrodrigues Moderador

Registrado: Quinta-Feira, 14 de Abril de 2005 Mensagens: 9009 Localização: Governador Valadares-MG
|
Enviada: Ter Out 05, 2010 9:29 am Assunto: |
|
|
| 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 |
|
 |
strak2012 Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014 Mensagens: 1518 Localização: Maceió - AL
|
Enviada: Ter Jan 14, 2014 1:20 pm Assunto: |
|
|
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 |
|
 |
claudio.ferreira Profissional


Registrado: Quarta-Feira, 18 de Setembro de 2013 Mensagens: 667
|
|
| Voltar ao Topo |
|
 |
strak2012 Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014 Mensagens: 1518 Localização: Maceió - AL
|
Enviada: Seg Jan 20, 2014 11:52 am Assunto: |
|
|
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 |
|
 |
claudio.ferreira Profissional


Registrado: Quarta-Feira, 18 de Setembro de 2013 Mensagens: 667
|
|
| Voltar ao Topo |
|
 |
claudio.ferreira Profissional


Registrado: Quarta-Feira, 18 de Setembro de 2013 Mensagens: 667
|
Enviada: Seg Jan 20, 2014 12:05 pm Assunto: |
|
|
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 |
|
 |
strak2012 Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014 Mensagens: 1518 Localização: Maceió - AL
|
Enviada: Seg Jan 20, 2014 12:22 pm Assunto: |
|
|
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 |
|
 |
claudio.ferreira Profissional


Registrado: Quarta-Feira, 18 de Setembro de 2013 Mensagens: 667
|
Enviada: Seg Jan 20, 2014 12:30 pm Assunto: |
|
|
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 |
|
 |
strak2012 Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014 Mensagens: 1518 Localização: Maceió - AL
|
Enviada: Seg Jan 20, 2014 12:50 pm Assunto: |
|
|
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 |
|
 |
|