Identificação e leitura de imagens
03/12/2003
0
1- Tenho um quadrado amarelo de arestas pretas e ao redor dele tudo é cinza, quando o ponteiro do mouse está sobre o amarelo, um label ou edit deve apresentar o nome da cor ou seu valor hexa. Ao colocar o mouse sobre a parte cinza, deve aparecer o nome cinza ou hexa, e quando o ponteiro estiver sobre a aresta, deve aparecer preto ou seu valor hexa.
2- Tenho dois quadrados amarelos sem bordas e todo o restante da tela é cinza, ao clicar um botão, o programa automaticamente indentificaria o limite entre o amarelo eo cinza e contornaria o quadrado automaticamente com uma borda preta. Estando os dois quadrados contornados, ele me informaria a distância em pixel, mm, etc... que separa um quadrado do outro.
Se alguém já fez um trabalho assim ou possui informações sobre isso, eu ficaria muito grato.
Obrigado.
Ricardo-op
Posts
03/12/2003
Marcelo Saviski
para a 1º dúvida faça o seguinte:
no eventoOnMouseMove do form faça:
Label1.Caption :=´#´ + IntToHex(Canvas.Pixels[X, Y], 6);
a 2º é mais complicada:
tente assim (é um modo lento, mas serve de exemplo)
var i, j: Integer Cor1, Cor2: TColor; R, G, B: Boolean; Dif: Boolean; begin for j := 0 to ClientWidht - 1 do begin for i := 0 to ClientHeight - 1 do begin Cor1 := Canvas.Pixels[i, j]; Cor2 := Canvas.Pixels[i +1, j + 1]; Dif := Cor 1 <> Cor2; if Dif then Canvas.Pixels[i, j] := clBlack; end; end;
A da distância ficou sem solução (ainda)
OBS: não testei nenhuma das funções
03/12/2003
Marconi
Para contornar basta utilizar as funções
Canvas.LineTo(x,y)
e Canvas.movTo(x,y)
os x e y seriam dados pelas propriedades top, height, left e width de cada um dos quadrados.
Para calcular a distância em pixeis bastaria verificar qual está mais à direita ou mais abaixo, comparando as propriedades top e left.
A distancia entre eles dependeria da posição que os achasse. Se estiverem em diagonal teria que aplicar pitagoras para encontrar a hipotenusa, que seria então a distância.
É meio complicado para montar mas a idéia é esta.
Marconi
04/12/2003
Ricardo-op
Obrigado mais uma vez.
04/12/2003
Marcelo Saviski
04/12/2003
Ricardo-op
04/12/2003
Jaguarnet7
Mas,oq vc prentende, recortar a imagem do osso???
04/12/2003
Marcelo Saviski
digamos que vc tenha a imagem, fundo preto com um quadrado verde no centro
seria algo + ou - assim:
(cada # é um pixel da imagem)
[color=green:57c8442a3e][/color:57c8442a3e]
[color=green:57c8442a3e][/color:57c8442a3e]
[color=green:57c8442a3e][/color:57c8442a3e]
e quer se gerar algo assim:
[color=red:57c8442a3e][/color:57c8442a3e]
[color=red:57c8442a3e][/color:57c8442a3e][color=green:57c8442a3e][/color:57c8442a3e][color=red:57c8442a3e][/color:57c8442a3e]
[color=red:57c8442a3e][/color:57c8442a3e][color=green:57c8442a3e][/color:57c8442a3e][color=red:57c8442a3e][/color:57c8442a3e]
[color=red:57c8442a3e][/color:57c8442a3e][color=green:57c8442a3e][/color:57c8442a3e][color=red:57c8442a3e][/color:57c8442a3e]
[color=red:57c8442a3e][/color:57c8442a3e]
o que se precisa fazer é passar pixel por pixel, e verificar se o do lado é diferente, se for, deixar ele vermelho
assim:
for Y := 0 to Height - 1 do for X := 0 to Width - 1 do if Pixels[X, Y] <> Pixels[X + 1, Y + 1] then Pixels[X, Y] := clRed;
a propriedade Pixels pertence ao Canvas, para usar o Canvas você precisa de uma Imagem Bitmap
faça esse teste bem simples:
coloque um Image e um botão, carregue um Bitmep qualquer que tenha ai, de preferencia com cores bem contrastantes e com uma cor de fundo uniforme, e coloque esse código no Botão:
for Y := 0 to Height - 1 do for X := 0 to Width - 1 do if Image.Picture.Bitmap.Canvas.Pixels[X, Y] <> Image.Picture.Bitmap.Canvas.Pixels[X + 1, Y + 1] then Image.Picture.Bitmap.Canvas.Pixels[X, Y] := clRed;
faça o teste e me diga se funcionou, é só um exemplo básico (e lento) que deve contornar a imagem
mas lembre-se de carregar uma imagem com poucas cores e fundo uniforme, de preferencia formas geométricas (é só um teste por enquanto)
qualquer dúvida pode falar, tenho bastante coisa sobre manipulação de imagens que poderão lhe servir
Clique aqui para fazer login e interagir na Comunidade :)