Page 1 sur 3

Reconnaissance d'objet WebCam

Publié : lun. 11/oct./2010 7:39
par Dumli
Salut tout le monde,
Nous voulons utiliser la Webcam pour reconnaître un objet remarquable. Après plusieurs recherches, nous ne savons pas comment "analyser" la séquence vidéo prise par la WebCam pour quelle trouve l'objet en question. Le but final est que la webcam connaisse la position de cette objet en X, et en Y en temps réel. Connaissez-vous une solution ?
Peut-être faudrait il commencer par l'analyse d'une simple image ?
PS : L'objet remarquable pourrait être une lumière (de type LED) Rouge, Verte, Bleu ou autre ...

Help ! Merci d'avance, :D

Re: Reconnaissance d'objet WebCam

Publié : lun. 11/oct./2010 9:13
par Dumli
La fonction Point() renvoit quoi exactement ? Parce qu'on obtient une suite de chiffre mais qui ne correspond pas forcément à la valeur RGB de la couleur. (exemple : 255 216 106)

Re: Reconnaissance d'objet WebCam

Publié : lun. 11/oct./2010 9:39
par Backup
Dumli a écrit :La fonction Point() renvoit quoi exactement ? Parce qu'on obtient une suite de chiffre mais qui ne correspond pas forcément à la valeur RGB de la couleur. (exemple : 255 216 106)
la fonction point renvoi la couleur du point ciblé !!
cependant, il faut cibler le bon Device context (DC)

par defaut Point va permettre de connaitre la couleur d'un point de l'écran
(voir startdrawing)

d'autre part dans windows (le bureau par ex) ;les couleurs renvoyé par point sont en (Bleu,vert,rouge)
et non pas (rouge ,vert,bleu) , il faut donc faire une inversion du rouge et du bleu !! ;)

si tu reçois un nombre , il corresponds bien a une couleur
pour retrouver les composant rouge,vert,bleu
il te faudra utiliser les fonctions

red(nombre)
blue(nombre)
green(nombre)

Re: Reconnaissance d'objet WebCam

Publié : lun. 11/oct./2010 10:08
par G-Rom
Pour reconnaitre des Forme , cherche du coté de perceptron sur google.
Pour une led , un traitement sur l'image peut être fait , passage en noir & blanc , joué avec la luminosité / contraste afin de ne voir que la led , tu as intérêt d'être calé dans l'optimisation de tes algos , car ca va ramé un max... :mrgreen:

Re: Reconnaissance d'objet WebCam

Publié : lun. 11/oct./2010 11:39
par Progi1984
Ou OpenCV...

Re: Reconnaissance d'objet WebCam

Publié : lun. 11/oct./2010 12:45
par Dumli
Il faudrait que le logiciel différencie le Bleu du Rouge pour la LED donc le passage en Noir et blanc est a éviter... Sinon c'est quoi OpenCV

Re: Reconnaissance d'objet WebCam

Publié : lun. 11/oct./2010 13:13
par Backup
Dumli a écrit :Il faudrait que le logiciel différencie le Bleu du Rouge pour la LED donc le passage en Noir et blanc est a éviter... Sinon c'est quoi OpenCV

le probleme avec point() c'est que ça va te sortir le taux de rouge d'une couleur... pas forcement rouge !

par exemple rgb(255,22,10) aura le meme taux de rouge que (255,0,0)
pourtant il s'agit de 2 couleurs differences :)

faudra donc lui préciser qu'elle est la couleur exacte , que tu veux detecter.
(en tenant compte des autres composante...)

Re: Reconnaissance d'objet WebCam

Publié : lun. 11/oct./2010 13:33
par G-Rom
OpenCV est une librairie spécialisé dans ce que tu veut faire , des CV open sources :D

http://www.dailymotion.com/video/xcp0c2 ... cv-bi_tech

Re: Reconnaissance d'objet WebCam

Publié : mar. 12/oct./2010 18:47
par cirederff
Salut si ça peut t'aider, pomper sur le forum, mais je sais plus ou

pour PB 4.31

Code : Tout sélectionner

EnableExplicit

;{ CAP constants
#WM_CAP_START = #WM_USER
#WM_CAP_DRIVER_CONNECT = #WM_CAP_START + 10
#WM_CAP_DRIVER_DISCONNECT = #WM_CAP_START + 11
#WM_CAP_DRIVER_GET_CAPS = #WM_CAP_START + 14
#WM_CAP_EDIT_COPY = #WM_CAP_START + 30
#WM_CAP_SET_PREVIEW = #WM_CAP_START + 50
#WM_CAP_SET_PREVIEWRATE = #WM_CAP_START + 52
#WM_CAP_STOP = #WM_CAP_START + 68
#WM_CAP_SET_SCALE = #WM_CAP_START + 53
#WM_CAP_START = #WM_USER
#WM_CAP_DLG_VIDEOSOURCE = #WM_CAP_START + 42
;}
#Main=0
#camWidth = 640
#camHeight = 480
#w16 = 40
#h16 = 30

Structure avg
  r.l
  g.l
  b.l
EndStructure

Global hWndC
Define Ccam_lib1, *capAddress

Procedure rotate90(*MemoryTarget,W,H,size)
  Protected X,Y,Target, Origin, *MemoryOrigin = AllocateMemory(size)
  CopyMemory(*MemoryTarget,*MemoryOrigin,size)
  For Y = 0 To H - 1
    For X = 0 To W - 1
      Origin = (Y * W + X) << 2
      Target = ((H - Y - 1) + (X * H)) << 2
      PokeL(*MemoryTarget + Target, PeekL(*MemoryOrigin + Origin))
    Next
  Next
  FreeMemory(*MemoryOrigin)
EndProcedure



Procedure greyScale(*Memory,MemorySize)
  Protected Counter, Color
  For Counter = 0 To MemorySize - 1 Step 4
    Color = PeekL(*Memory + Counter)
    Color = (Red(Color) + Green(Color) + Blue(Color)) / 3
    PokeL(*Memory + Counter, RGB(Color, Color, Color))
  Next
EndProcedure



Procedure captureImage(dummy)
  Protected image, bmp.BITMAP, imageID, imageSize, *bits, pos
  Protected Dim prev.avg(#w16,#h16)
  Protected x,y,yy,xx, avg.avg, color, diff
 
  Repeat
    SendMessage_(hWndC,#WM_CAP_EDIT_COPY,0,0)
    image = GetClipboardImage(#PB_Any,32)
    imageID = ImageID(image) ;maybe flip it first
   
    GetObject_(imageID,SizeOf(BITMAP),@bmp.BITMAP)
    imageSize = bmp\bmWidthBytes * bmp\bmHeight
    *bits = bmp\bmBits
   
    StartDrawing(WindowOutput(0))
    DrawImage(imageID,0,0);____________________________________________ici
    DrawingMode(#PB_2DDrawing_Outlined)
   
    For x=0 To #w16-1
      For y=0 To #h16-1
        avg\r = 0: avg\g=0: avg\b=0
        For xx=x*16 To x*16+16-1
          For yy=y*16 To y*16+16-1
            pos = (yy * bmp\bmWidth + xx) << 2
            color = PeekL(*bits+pos)
            avg\r + Red(color)
            avg\g + Green(color)
            avg\b + Blue(color)
            ;Plot(xx,479-yy,color)
          Next
        Next
        avg\r = avg\r / 256
        avg\g = avg\g / 256
        avg\b = avg\b / 256
        ;Box(x*16,y*16,16,16,RGB(avg\r,avg\g,avg\b))
        diff = 0
        diff + Abs(prev(x,y)\r - avg\r)
        diff + Abs(prev(x,y)\g - avg\g)
        diff + Abs(prev(x,y)\b - avg\b)
        If diff > 40
          Box(x*16,464-y*16,15,15,#Green)
          ;Circle(x*16+8,464-y*16+8,8,#Green) or circles if you want
        EndIf
        prev(x,y)\r = avg\r
        prev(x,y)\g = avg\g
        prev(x,y)\b = avg\b
      Next
    Next
   
      ;DrawImage(imageID,0,0)
    StopDrawing()
    FreeImage(image)
   
    ;Delay(2000)
  ForEver
EndProcedure



If OpenWindow(#Main,0,0,640,480,"Webcam Motion Detector by JLC",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
  Ccam_lib1 = OpenLibrary(#PB_Any, "avicap32.dll")
  If Ccam_lib1
    *capAddress = GetFunction(Ccam_lib1, "capCreateCaptureWindowA")
    hWndC = CallFunctionFast(*capAddress, "My Capture Window", #WS_CHILD | #WS_VISIBLE, 0,0, 1 , 1, WindowID(#Main),0)
    SendMessage_(hWndC, #WM_CAP_DRIVER_CONNECT, 0, 0)
    SendMessage_(hWndC, #WM_CAP_SET_OVERLAY, #True, 0)
    SendMessage_(hWndC, #WM_CAP_SET_PREVIEW, #True, 0)
    SendMessage_(hWndC, #WM_CAP_SET_PREVIEWRATE, 1, 0)
  EndIf
EndIf


CreateThread(@captureImage(),0)

Repeat
  Delay(10)
Until WaitWindowEvent() = #PB_Event_CloseWindow

SendMessage_(hWndC,#WM_CAP_STOP,0,0)
SendMessage_(hWndC,#WM_CAP_DRIVER_DISCONNECT,0,0)
DestroyWindow_(hWndC)
CloseLibrary(Ccam_lib1)

Re: Reconnaissance d'objet WebCam

Publié : mar. 12/oct./2010 20:44
par Dumli
OpenCV ça correspond à quel langage ? C ? Et sinon, je rencontre un nouveau problème qui est le suivant, pour le moment j'arrive à repérer du rouge dans une image BMP, mais pour une vidéo je ne sais pas comment faire à part décomposer la vidéo Image par Image puis de les analyser une par une, ce qui serait très long et très lent. :(
Donc ? Une idée ?
Merci en tout cas pour vos réponses ! :wink:

Re: Reconnaissance d'objet WebCam

Publié : mar. 12/oct./2010 22:05
par Backup
.......................

Re: Reconnaissance d'objet WebCam

Publié : mer. 13/oct./2010 1:26
par Ar-S
Dommage que ma quickcam 3000 ne marche pas sous 7 (merci du non suivi des pilotes Mr Logitech de mes 2 sphères...)

Re: Reconnaissance d'objet WebCam

Publié : mer. 13/oct./2010 17:17
par Dumli
Merci pour le code, je vais l'étudier et sinon pour OpenCV vous savez quoi sur ça ?

Re: Reconnaissance d'objet WebCam

Publié : mer. 13/oct./2010 19:33
par PBW32
ImageJ en java fais cela et bien plus : http://fr.wikipedia.org/wiki/ImageJ
ImageJ peut visualiser, éditer, traiter, et analyser les images ou des piles d'images (stack) en 8-bits, 16-bits, 32-bits et les images couleur. ImageJ est capable ouvrir et sauver des images dans de nombreux formats, notamment en TIFF, PNG, GIF, JPEG, BMP, DICOM, FITS, mais aussi des images en format brut (raw).

ImageJ est un logiciel libre : le code source est en accès libre et peut être modifié. C'est un logiciel multiplateformes, en raison de son fonctionnement sur une machine virtuelle Java. Ses fonctions sont extensibles ; de nombreux plug-ins existent, qui abordent des domaines jusque là réservés aux logiciels commerciaux comme Aphelion : manipulation et visualisation d'images tridimensionelles, filtrages médians et morphologiques 3D, contours actifs (snakes), filtres diffusifs... Par ailleurs, il est possible de combiner les fonctions natives ou ajoutées en créant des macros - la maîtrise de Java n'est pas alors nécessaire. La foisonnante diversité des plug-ins disponibles - plus d'une centaine - en fait son avantage principal, mais peut dérouter les néophytes : il est parfois difficile de trouver rapidement une fonction correspondant à un besoin précis.
Liens externes [modifier]

Re: Reconnaissance d'objet WebCam

Publié : mer. 13/oct./2010 20:00
par Ollivier
@PBW32

C'est à en boucher le trou de la sécu!!! Merci pour ce lien!

Ollivier