RECONHECIMENTO DE IMAGEM

NICKOLASCARLOS 13/06/2014 15:26:55
#438897
Pedro47501 este código não funcionou, pois este codigo só funciona com duas imagem extremamentes iguais, eu quero um que retorne valor pela semelhança!
NAUTILUZ 13/06/2014 16:27:06
#438898
To fazendo um programa de dacaptcha aqui
logo vou postar no meu site aguiatec.hostei.com,
e nele identifico a semelhança e armazeno o valor num vetor,
o qual no final me retorna o nome da imagem pelo maior índice de semelhança.

semelhanca(cont) = ImagesSame(Picture1, Picture2)

[ô]no modulo
Option Explicit
Private Type BITMAPINFOHEADER
biSize As Long
biWidth As Long
biHeight As Long
biPlanes As Integer
biBitCount As Integer
biCompression As Long
biSizeImage As Long
biXPelsPerMeter As Long
biYPelsPerMeter As Long
biClrUsed As Long
biClrImportant As Long
End Type

Private Type RGBQUAD
rgbBlue As Byte
rgbGreen As Byte
rgbRed As Byte
rgbReserved As Byte
End Type

Private Type BITMAPINFO
bmiHeader As BITMAPINFOHEADER
bmiColors As RGBQUAD
End Type

Private Declare Function GetDIBits Lib [Ô]gdi32[Ô] (ByVal aHDC As Long, ByVal hBitmap As Long, ByVal nStartScan As Long, ByVal nNumScans As Long, lpBits As Any, lpBI As BITMAPINFOHEADER, ByVal wUsage As Long) As Long

Private lonPix_1() As Long
Private lonPix_2() As Long

Public Function ImagesSame(Pic_1 As PictureBox, Pic_2 As PictureBox) As Currency
Dim bih_1 As BITMAPINFOHEADER, bih_2 As BITMAPINFOHEADER

With bih_1
.biSize = Len(bih_1)
.biPlanes = 1
.biWidth = Pic_1.ScaleWidth
.biHeight = Pic_1.ScaleHeight
.biBitCount = 32
End With

bih_2 = bih_1

ReDim lonPix_1((bih_1.biWidth * bih_1.biHeight) - 1)
ReDim lonPix_2((bih_2.biWidth * bih_2.biHeight) - 1)

GetDIBits Pic_1.hDC, Pic_1.Picture.Handle, 0&, bih_1.biHeight, lonPix_1(0), bih_1, 0
GetDIBits Pic_2.hDC, Pic_2.Picture.Handle, 0&, bih_2.biHeight, lonPix_2(0), bih_2, 0

ImagesSame = ComparePixels

Erase lonPix_1()
Erase lonPix_2()
End Function

[ô]Returns true if pixels from both arrays are the same.
Private Function ComparePixels() As Currency
Dim lonU1 As Long, lonU2 As Long
Dim bolFound As Boolean, lonLoop As Long
Dim Pontos As Currency
Pontos = 0
lonU1 = UBound(lonPix_1())
lonU2 = UBound(lonPix_2())


For lonLoop = LBound(lonPix_1()) To lonU1
If lonPix_1(lonLoop) = lonPix_2(lonLoop) Then
Pontos = Pontos + 1
End If
Next lonLoop


ComparePixels = Pontos [ô]((Pontos / 1000) / (lonU1 / 1000)) * 100

End Function



NICKOLASCARLOS 13/06/2014 16:32:41
#438899
Sim, é mais ou menos isso que preciso, po'rem tenho que testar com varias outras imagens antes que retorne um valor que defina a imagem!
NAUTILUZ 13/06/2014 16:42:10
#438903
Citação:

:
Sim, é mais ou menos isso que preciso, po'rem tenho que testar com varias outras imagens antes que retorne um valor que defina a imagem!



Pode manter o valor da segunda picture em uma tabela e comparar se 100% igual e dai chutar..
pois a semelhança e um numero de pixel encontrado..
NICKOLASCARLOS 13/06/2014 17:15:24
#438904
Isso msm que preciso, mais como faço isso?
NAUTILUZ 13/06/2014 17:25:54
#438905
Da pra fazer diretamente na função ComparePixels
if pontos = lonU2 then chuta = true [ô]100% igual

[ô]Olha vou ser franco, reconhecimento de imagem leva muita técnica e refinamento
o refinamento a que me refiro são os pre-filtros como tamanho,
cores e manipulação de blocos e também posicionamento
se fosse fácil computadores por ai já estaria lendo imagens a muito tempo...
Página 2 de 2 [16 registro(s)]
Tópico encerrado , respostas não são mais permitidas