Visualizzazione post con etichetta Webcam. Mostra tutti i post
Visualizzazione post con etichetta Webcam. Mostra tutti i post

martedì 11 marzo 2014

Cambiare diapositiva su Impress mediante gesture a webcam

Un amico mi ha chiesto se era possibile sviluppare una piccola applicazione interattiva per il museo di Scienze Geologiche del Dipartimento di Scienze della Terra di Firenze
L'idea di base era quella di usare Kinect per cambiare la slide ad una presentazione a video

L'idea mi sembrava carina ma piuttosto costosa in quanto necessita di un Kinect e di un computer discretamente potente per fare processare i dati (Kinect di suo non interpreta le gesture, e' solo un insieme di sensori)..volevo vedere se era possibile fare la stessa cosa usando solo una Raspberry ed una normale Webcam




L'idea di base e' stata rubata a questo sito semplificando di molto per cio' che non mi occorre. In pratica sull'immagine della Webcam sono state create due aree sensibili (i due cerchietti in alto, per essere precisi vengono letti solo due pixel), se l'utente passa la mano sui cerchietti (o meglio se viene individuata una variazione dell'immagine in corrispondenza dei pixel sensibili) viene generato un evento.
Per evitare falsi allarmi e' stato impostato una distanza minima di 1.5 secondi tra due eventi
Il programma processa i dati della webcam, crea una immagine differenza tra le immagini in sequenza e crea una immagine maschera dei pixel che risultano cambiati (si puo' vedere premendo il tasto d durante l'esecuzione). La condizione di pixel non cambiato e' 0, la condizione di cambiato e' 255

Se viene generato un evento allora mediante il programma xdotool viene inviato un segnale Freccia Destra/ Freccia Sinistra alla finestra che ha per nome "'presentazione.odp - LibreOffice Impress"

Ovviamente ci sono dei limiti all'utilizzo (del tipo la webcam non deve essere orientata verso il corridoio del museo altrimenti vengono generati eventi ogni volta che passa una persona) ma considerando il costo dell'applicazione e le possibili applicazioni (si puo' fare per esempio un quiz interattivo per bambini) direi che e' abbastanza interessante

-----------------------------------------------------------------------------
#!/usr/bin/env python

import cv
import time

from scipy import *
from scipy.cluster import vq
import numpy
import sys, os, random#, hashlib

from math import *


class Target:
def __init__(self):

if len( sys.argv ) > 1:
self.writer = None
self.capture = cv.CaptureFromFile( sys.argv[1] )
frame = cv.QueryFrame(self.capture)
frame_size = cv.GetSize(frame)
else:
fps=15
is_color = True


self.capture = cv.CaptureFromCAM(0)
cv.SetCaptureProperty( self.capture, cv.CV_CAP_PROP_FRAME_WIDTH, 640 );
cv.SetCaptureProperty( self.capture, cv.CV_CAP_PROP_FRAME_HEIGHT, 480 );
frame = cv.QueryFrame(self.capture)
frame_size = cv.GetSize(frame)

self.writer = None

frame = cv.QueryFrame(self.capture)
cv.NamedWindow("Museo", 1)



def run(self):

frame = cv.QueryFrame( self.capture )
frame_size = cv.GetSize( frame )

contatore = 0
tempo_d = 0
tempo_s = 0

# Capture the first frame from webcam for image properties
display_image = cv.QueryFrame( self.capture )

# Greyscale image, thresholded to create the motion mask:
grey_image = cv.CreateImage( cv.GetSize(frame), cv.IPL_DEPTH_8U, 1 )

# The RunningAvg() function requires a 32-bit or 64-bit image...
running_average_image = cv.CreateImage( cv.GetSize(frame), cv.IPL_DEPTH_32F, 3 )
# ...but the AbsDiff() function requires matching image depths:
running_average_in_display_color_depth = cv.CloneImage( display_image )

# The difference between the running average and the current frame:
difference = cv.CloneImage( display_image )

#t0 = time.time()

# For toggling display:
image_list = [ "camera", "difference", "threshold"]
image_index = 0   # Index into image_list


# Prep for text drawing:
text_font = cv.InitFont(cv.CV_FONT_HERSHEY_COMPLEX, .5, .5, 0.0, 1, cv.CV_AA )


while True:
# Capture frame from webcam
camera_image = cv.QueryFrame( self.capture )

frame_t0 = time.time()

# Create an image with interactive feedback:
display_image = cv.CloneImage( camera_image )

# Create a working "color image" to modify / blur
color_image = cv.CloneImage( display_image )

# Smooth to get rid of false positives
cv.Smooth( color_image, color_image, cv.CV_GAUSSIAN, 19, 0 )

# Use the Running Average as the static background
# a = 0.020 leaves artifacts lingering way too long.
# a = 0.320 works well at 320x240, 15fps.  (1/a is roughly num frames.)
cv.RunningAvg( color_image, running_average_image, 0.320, None )

# Convert the scale of the moving average.
cv.ConvertScale( running_average_image, running_average_in_display_color_depth, 1.0, 0.0 )

# Subtract the current frame from the moving average.
cv.AbsDiff( color_image, running_average_in_display_color_depth, difference )

# Convert the image to greyscale.
cv.CvtColor( difference, grey_image, cv.CV_RGB2GRAY )

# Threshold the image to a black and white motion mask:
cv.Threshold( grey_image, grey_image, 2, 255, cv.CV_THRESH_BINARY )
# Smooth and threshold again to eliminate "sparkles"
cv.Smooth( grey_image, grey_image, cv.CV_GAUSSIAN, 19, 0 )
cv.Threshold( grey_image, grey_image, 240, 255, cv.CV_THRESH_BINARY )

grey_image_as_array = numpy.asarray( cv.GetMat( grey_image ) )




c = cv.WaitKey(7) % 0x100
if c == 27 or c == 10:
break

# Toggle which image to show
if chr(c) == 'd':
image_index = ( image_index + 1 ) % len( image_list )

image_name = image_list[ image_index ]


# Display frame to user
if image_name == "camera":
image = camera_image
cv.PutText( image, "O", (50,50), text_font, cv.CV_RGB(255,0,0) )
cv.PutText( image, "O", (590,50), text_font, cv.CV_RGB(0,255,0) )
elif image_name == "difference":
image = difference
cv.PutText( image, "O", (50,50), text_font, cv.CV_RGB(255,0,0) )
cv.PutText( image, "O", (590,50), text_font, cv.CV_RGB(0,255,0) )

elif image_name == "threshold":
# Convert the image to color.
cv.CvtColor( grey_image, display_image, cv.CV_GRAY2RGB )
image = display_image  # Re-use display image here
cv.PutText( image, "O", (50,50), text_font, cv.CV_RGB(255,0,0) )
cv.PutText( image, "O", (590,50), text_font, cv.CV_RGB(0,255,0) )

cv.PutText( image, str(contatore), (320,50), text_font, cv.CV_RGB(0,0,255) )

cv.ShowImage( "Museo", image )

#print grey_image_as_array.item((50,50))

if ((grey_image_as_array.item(50,50) == 255) and ((time.time()-tempo_d) > 1.5)):
#print time.time()-tempo_d
tempo_d = time.time()
contatore = contatore + 1
#print "destra"
os.system("xdotool key --window $(xdotool search --name 'presentazione.odp - LibreOffice Impress') Left")


if ((grey_image_as_array.item(50,590) == 255) and ((time.time()-tempo_s) > 1.5)):
#print time.time()-tempo_s
tempo_s = time.time()
contatore = contatore - 1
#print "sinistra"
os.system("xdotool key --window $(xdotool search --name 'presentazione.odp - LibreOffice Impress') Right")



if self.writer:
cv.WriteFrame( self.writer, image );



if __name__=="__main__":
t = Target()
t.run()




venerdì 15 novembre 2013

Utilizzo di IP Camera Maygion su Linux

aggiornamento 20 maggio 2016
---------------------------------------
se si collega la camera con il cavo 192.168.1.111
per resettare il firmware si seguono le istruzioni a questa pagina
le istruzioni sul movimento della ptz del codice Python non sono esattamente corrette. Debuggando
la pagina web dell'amministrazione della camera le istruzioni corrette sono



html=urlopen(ur+"moveptz.xml?dir="+direzione+"&user=admin&password=admin")
time.sleep(0.1)
html=urlopen(ur+"moveptz.xml?dir=stop&user=admin&password=admin"

in pratica si fa movimento in una direzione, si attende e poi si stoppa, altrimenti il movimento va a fine corsa
---------------------------------------


Per cercare un sostituto a basso costo della IP Camera Samsung PTZ vista in questo post mi sono per una trentina di euro questa Ip Camera non marcata su un e-commerce cinese

La cosa divertente dell'acquistare prodotti cinesi e' che arrivano totalmente privi di istruzioni e sostanzialmente privi di marca per cui la prima sfida e' stata quella di capire cosa avevo davanti. Il cd incluso con i driver recava un directory denominata asw-380 ed un manuale in inglese ma senza indicazioni di marca e modello.


Guardando in una immagine relativa all'uso del software Android IP Cam Viewer viene riportato che deve essere selezionata l'opzione MayGion IP Camera V3 e questa e' stata l'indicazione fondamentale per individuare il modello.
Per quanto riportato dal manuale la camera e' pilotabile via browser mediante un OCX..quindi non solo sarei stato costretto ad usarlo sotto Windows ma sarei stato costretto ad usare Internet Explorer...la presenza di un programma per Android comunque mi lasciava speranze

La configurazione della rete wireless e' stata semplice perche' sul retro della camera e' disponibile il pulsante WPS per cui il WiFi e' stato autoconfigurato senza l'utilizzo di un computer esterno

Frugando su Internet vi sono frammentarie e scarse informazioni ma sono riuscito a trovare un paio di Pdf in cinese che mostrano la possibilita' di pilotare il dispositivo mediante delle URL (attenzione: esistono due versioni del software della IP Camera MayGion che differiscono sensibilmente, si deve individuare quindi il corretto set di URL)

Per visualizzare lo stream video si puo' utilizzare VLC usando come sorgente del flusso di rete questa URL
http://ipcamera:81/videostream.asf?usr=admin&pwd=admin

Per quanto riguarda il movimento PTZ ho scritto invece un semplice programmino in Python che sfrutta un joystick per muovere la camera

----------------------------------------------
import pygame,time

try:
    from urllib.request import urlopen
except ImportError:
    from urllib2 import urlopen

pygame.init()
j = pygame.joystick.Joystick(0)
j.init()
conta = 0
tick = 100

try:
    while True:
conta=conta+1
        pygame.event.pump()
        if j.get_button(0) == 1:
print "Pulsante 1 : "+str(j.get_button(0))
html=urlopen("http://192.168.0.102:81/cmd.xml?cmd=moveptz&tick="+str(tick)+"&nPtzTimes="+str(conta)+"&dir=up&user=admin&password=admin")
html=urlopen("http://192.168.0.102:81/cmd.xml?cmd=moveptz&nPtzTimes="+str(conta)+"&dir=none&user=admin&password=admin")

        if j.get_button(1) == 1:
print "Pulsante 2 : "+str(j.get_button(1))
html=urlopen("http://192.168.0.102:81/cmd.xml?cmd=moveptz&tick="+str(tick)+"&nPtzTimes="+str(conta)+"&dir=right&user=admin&password=admin")
html=urlopen("http://192.168.0.102:81/cmd.xml?cmd=moveptz&nPtzTimes="+str(conta)+"&dir=none&user=admin&password=admin")

        if j.get_button(2) == 1:
print "Pulsante 3 : "+str(j.get_button(2))
html=urlopen("http://192.168.0.102:81/cmd.xml?cmd=moveptz&tick="+str(tick)+"&nPtzTimes="+str(conta)+"&dir=down&user=admin&password=admin")
html=urlopen("http://192.168.0.102:81/cmd.xml?cmd=moveptz&nPtzTimes="+str(conta)+"&dir=none&user=admin&password=admin")

        if j.get_button(3) == 1:
print "Pulsante 4 : "+str(j.get_button(3))
html=urlopen("http://192.168.0.102:81/cmd.xml?cmd=moveptz&tick="+str(tick)+"&nPtzTimes="+str(conta)+"&dir=left&user=admin&password=admin")
html=urlopen("http://192.168.0.102:81/cmd.xml?cmd=moveptz&nPtzTimes="+str(conta)+"&dir=none&user=admin&password=admin")


        if j.get_button(4) == 1:
print "Pulsante 4 : "+str(j.get_button(4))
tick = tick+25
if tick > 200:
tick = 200

        if j.get_button(5) == 1:
print "Pulsante 5 : "+str(j.get_button(4))
tick = tick-25
if tick < 50:
tick = 25


time.sleep(0.1)

except KeyboardInterrupt:
    j.quit()

----------------------------------------------


sabato 6 ottobre 2012

Webcam Logitech C310 su Debian Testing

Mi sono comprato la Logitech C310 perche' sembrava essere pienamente compatibile con Raspberry, cosa che in realta' si e' rivelata errata



In compenso la Webcam funziona in modo decisamente buono (se non ottimo) se paragonata alle altre Webcam dal costo di qualche euro inferiore
Le prove sono state effettuate nelle peggiori condizioni per una webcam ovvero in una stanza buia con la sola lampada della scrivania accesa ma la resa e' notevole

Screenshot da VLC



utilizzando FFMpeg invece si puo' usare la stringa (ripresa da qui)

ffmpeg -f alsa -ac 2 -ar 48000 -i hw:0,0 -acodec mp2 -f video4linux2  -r 30 -i /dev/video0 -vcodec mjpeg -sameq ffmpeg.avi

Per quanto riguarda Debian nella versione testing vengono riconosciuti correttamente sia la parte video che la  parte audio (microfono) ma il programma Cheese non riesce a funzionare correttamente (ha un ritardo veramente notevole)



venerdì 24 agosto 2012

Webcam ARKMicro

Ho ceduto alla tentazione di comprare su DealExtreme una webcam per circa 4 euro (spedizione compresa).
La descrizione parla di una camera 640x480 con led per illuminazione

Una volta inserita nella Linux Box e' stata immediatamente riconosciuta (temevo il peggio)
-----------------------------------------------------------------------

Aug 24 15:15:41 kranz kernel: [ 5669.032091] usb 2-1: new full speed USB device using uhci_hcd and address 2
Aug 24 15:15:41 kranz kernel: [ 5669.195355] usb 2-1: New USB device found, idVendor=18ec, idProduct=3290
Aug 24 15:15:41 kranz kernel: [ 5669.195369] usb 2-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
Aug 24 15:15:41 kranz kernel: [ 5669.195379] usb 2-1: Product: USB2.0 PC CAMERA
Aug 24 15:15:41 kranz kernel: [ 5669.195386] usb 2-1: Manufacturer: ARKMICRO
Aug 24 15:15:41 kranz kernel: [ 5669.195588] usb 2-1: configuration #1 chosen from 1 choice
Aug 24 15:15:41 kranz kernel: [ 5669.197529] uvcvideo: Found UVC 1.00 device USB2.0 PC CAMERA (18ec:3290)
Aug 24 15:15:41 kranz kernel: [ 5669.200674] input: USB2.0 PC CAMERA as /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1:1.0/input/input11
-----------------------------------------------------------------------

e qui sono arrivate le sorprese
la webcam e' in realta' una 320x240 di pessima qualita' con dei led nel visibile che sono assolutamente inutili in quanto non riescono ad illuminare in qualsiasi condizioni ambientale (se erano ad infrarossi forse era meglio)

certo che il confronto con la webcam integrata nel portatile 640x480 reali (che pure non e' eccezionale nelle prestazioni soprattutto con poca illumicazione) e' impietoso

certo funzionare funziona e per meno di 4 euro (spedizione compresa) puo' essere anche abbastanza

Webcam ARKMicro

Webcam integrata nel portatile

mercoledì 22 agosto 2012

Cattura video su Raspberry

Primo tentativo di cattura video su Raspberry. E' stata utilizzata una Logitech QuickCam 2500 con l'installazione di default di ffmpeg di Rapbian (che e' conosciuta per essere buggata)

La stringa di configurazione di ffmpeg e' la seguente
ffmpeg -f video4linux2 -s 640x472 -r 5  -sameq -i /dev/video0 -f m4v  /home/pi/5.m4v

320x240

640x472

martedì 21 agosto 2012

Confronto Webcam

prima di tutto mi scuso per il soggetto

Un confronto tra differenti Webcam impiegate nelle stesse condizioni ambientali e con il medesimo software. La differenza in qualita' si vede..... e si paga
Webcam interna al portatile Samsung N150 Plus


Logitech V-UCV29 QuickConnect 2500 series

Logitech C310

Geologi

  E so anche espatriare senza praticamente toccare strada asfaltata