Holas a todos, tenia una duda :huh: : se puede comparar 2 imagenes ? porke pensaba en hacer un programa de vigilancia con mi cam , o kaso contrario alguna forma que mi cam detecte movimientos. Gracias ;D
Si que se puede, te paso el kode:
Dim a As String
Dim b As String
Dim Rutaimagen As String
Dim Rutaimagen2 As String
Rutaimagen = "C:\image.jpg"
Open Rutaimagen For Binary As #1
a = Space(FileLen(Rutaimagen))
Get #1, , a
Close #1
Open Rutaimagen2 For Binary As #1
b = Space(FileLen(Rutaimagen2))
Get #1, , b
Close #1
If a = b Then
MsgBox "Estas Imagenes son iguales"
Else
MsgBox "Estas imaganes son diferentes"
End If
Espero ek te sirva....
Salu2
Hendrix
no entiendo ?? me podrias poner los comentarios pls solo entiendo lo de las variables pls, porfis no comprendo mucho, gracias
xD xD y tu kieres hacer un Centinela para la cam??? xD xD
Weno, te lo expliko, lo que hace este programa es abrir las dos imagenes que kieres mirar si son iguales, las abre en binario.
Luego las kompara, si son iguales te dice: son iguales, y si no lo son te dice: no son iguales...xD
Lo entienes???? es muy facil....
Salu2
Hendrix
Eso es con archivos guardados en la pc, si queres trabajar con imagenes en tiempo de ejecucion podes usar la api GetPixel
Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long) As Long
Private Sub Form_Load()
Picture1.ScaleMode = vbPixels
MsgBox GetPixel(Picture1.hdc, 10, 10)
End Sub
Eso te daria el color del pixel que hay en el Picutre1 en las coordenadas 10, 10.
Te podes fijar en dos imagenes diferentes las mismas coordenadas, asi si son diferentes, el color va a ser distinto.
Saludos.-
gracias aver primero probare el primer kodigo, es que no comprendia onde iba la seguna imagen seria : "Rutaimagen2= "C:\image2.jpg"" , solo me faltaba ver eso pa entenderlo , gracias nos vimos
Es cierto que el codigo dado por _Hendrix_ sirve para comparar dos imagenes. Pero eso en la vida real no te va a servir ya que cuando tu recibes una imagen con la cam, y aunque no haya habido movimiento, la siguiente no es exactamente identica. Siempre hay un minimo cambio.
Lo que tienes que hacer es comprarar cada pixel como a dicho NYlOn, usando 2 For y dar un margen de error en el color de un 20% porke siempre los colores de la cam cambian un poko.
Salu2
Hola yo estoy haciendo exactamente lo mismo osea una alrma con una webcam y me funciona muy bien, no te paso el proyecto porque no lo termino aun y es un verdadero quilombo de codigo pero te pongo parte del codigo donde comparo las imagenes
de todas formas hice algunas automatizaciones ya que la webcam va cambiando su gama a desde que se inicia entonces tienes que hacer que la comparacion tenga ciertos rangos de diferencia (es algo dificil de explicar)
Sub Calcular()
On Error Resume Next
Dim Contador As Long, x As Long, y As Long
For x = 0 To Picture1.Width Step Picture1.Width / 100
For y = 0 To Picture1.Height Step Picture1.Height / 100
If GetPixel(Picture1.hdc, x, y) < GetPixel(Picture2.hdc, x, y) - 1500000 Or GetPixel(Picture1.hdc, x, y) > GetPixel(Picture2.hdc, x, y) + 1500000 Then
Contador = Contador + 1
End If
Next
Next
ProgressBar1.Value = ProgressBar1.Min
If Contador > ProgressBar1.Max Then Contador = ProgressBar1.Max
ProgressBar1.Value = Contador
If Slider1.Value <= ProgressBar1.Value + 10 Then Slider1.Value = Slider1.Value + 5
If Contador >= Slider1.Value Then
Slider1.Value = Slider1.Value + 10
sndplaysound "C:\Archivos de programa\Windows NT\Pinball\SOUND36.WAV", SND_NODEFAULT + SND_ASYNC 'App.Path &
Image1(3) = Image1(2)
'-------***********-------
If Form2.ChkVideo Then Grabar 'comienza a grabar el video
'-------***********-------
Else
Image1(3) = Image1(1)
If Slider1.Value > ProgressBar1.Value + 100 Then Slider1.Value = Slider1.Value - 10
End If
End Sub
sorry x mi ignorancia , pero como haces para grabar lo de tu cam??, es que soy inexperto ( pero con muxas ganas de aprender). Gracias spero su respuesta
hola te paso un ejemplo
http://ar.geocities.com/leandroascierto/webcam.zip (http://ar.geocities.com/leandroascierto/webcam.zip)
fijate que de esta forma no usa timer ni ocupa el portapapeles pero
es importante que la aplicacion este siempre visible , tambien tiene una contra de esta forma no vas a poder comparar las imagenes porque lo que hace es enviarle un hwnd de una ventana para que el dispositivo de captura se reprodusca, yo lo que hice para la alarma es enviarle un SendMessage para que guarde constantemente las capturas en un archivo(.bmp) y luego desde alli las voy cargando a un picture y las voy comparando cuadro por cuadro
te paso la rutina para guardar la imagen ya que en el ejemplo del enlace no lo tiene
para esto si uso un timer, pero cuando empieza a grabar el video, el timer se detiene
Dim nombre As String
'------le paso el nombre para guardar una foto
nombre = StrConv(App.Path & "\TMPfoto.bmp", vbFromUnicode)
SendMessage mCapHwnd, WM_CAP_FILE_SAVEDIB, 0, StrPtr(nombre)
Picture1.PaintPicture LoadPicture(App.Path & "\TMPfoto.bmp"), 0, 0, Picture1.Width, Picture1.Height
Picture1.Picture = Picture1.Image
Bueno no es por deslentarte pero viene complicado el asunto yo hace rato que vengo con este proyecto y aun lo puedo terminar
Saludos