Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

WEBCAM À MANIVELLE


Information sur la source

Catégorie :Périphériques Classé sous : webcam, tempsréel, pointeurs, vidéo Niveau : Initié Date de création : 19/06/2007 Date de mise à jour : 22/06/2007 09:49:06 Vu / téléchargé: 6 396 / 872

Note :
10 / 10 - par 4 personnes
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (15)
Ajouter un commentaire et/ou une note

Description

Cliquez pour voir la capture en taille normale
C'est juste une démo des possibilités des modifications en temps réel des images provenant d'une webcam. Faut pas se vautrer avec les pointeurs !
- Teinte sépia
- Rayures
- Bruit
- Instabilité

 

Conclusion

Voici un petit projet que je me suis bien amusé à faire ! (je ne pensais pas aller aussi loin dans l'ajout d'effets)

Il n'est pas garanti sans bugs et contient certaines limitations.

- Taille de cadres imposés par le format vidéo utilisé (je recommande 320x240 max)
- Le son n'est pas vieilli ! (faut pas exagérer !)
- Je n'ai plus de visualisation pendant l'enregistrement en mode 640x480

Un double click sur l'image lance et stoppe l'enregistrement dans le fichier FILM.AVI.

22/06/2007
*Le mode de compression I420 est supporté (ainsi que le mode RGB24)

 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

20 juin 2007 09:38:54 :
Possibilité de modifier la vitesse de lecture du fichier AVI créé.
21 juin 2007 09:26:55 :
Modification pour fonctionnement en 640x480 (pas de visualisation pendant l'enregistrement dans ce format, chez moi en tout cas) Nouveaux effets : taches, désynchronisation
22 juin 2007 09:49:07 :
Support pour mode vidéo I420

Commentaires et avis

signaler à un administrateur
Commentaire de f0xi le 19/06/2007 13:31:48 administrateur CS





ça a l'air pas mal, mais n'ayant pas de webcam pour verifier .... :)


petite optim :


procedure TForm1.Capture1Frame(Sender: TObject; HndPreview: Cardinal; lpVHdr: PVIDEOHDR);
var
  Pointeur, P2: PTabByte;
  iia,iib, i, j, a, b, c: integer;
begin
  Pointeur := Pointer(lpVHdr^.lpData);
  P2 := Bitmap.ScanLine[239];
  a  := Capture1.Width;
  b  := Capture1.Height;

  if sepia.Checked then
    for i := 0 to a - 1 do
      for j := 0 to b - 1 do
      begin
        iia := (j * a + i) * 3;
        Pointeur^[iia + 2] := Pointeur^[iia + 2];
        Pointeur^[iia + 1] := Pointeur^[iia + 2];
        Pointeur^[iia + 0] := TabSepia[Pointeur^[iia + 2]];
      end;
  if rayures.Checked then
    for i := 0 to tbRayures.Position do
      if Rayure[i] <> nil then
        with Rayure[i] do
        begin
          for j := 0 to Capture1.Height - 1 do
          begin
            iia := (j * a + Position) * 3;
            Pointeur^[iia] := Pointeur^[iia] shr 1;
            Pointeur^[iia + 1] := Pointeur^[iia] shr 1;
            Pointeur^[iia + 2] := Pointeur^[iia] shr 1;
          end;
          Position := Position + Random( (Stabilite shl 1) + 1) - Stabilite;
          if (position < 0) or (position >= a) then
            Duree := 1;
          dec(Duree);
          if Duree = 0 then
          begin
            Rayure[i].Free;
            Rayure[i] := nil;
          end;
        end;

  if poussieres.Checked then
    for i := 0 to tbPoussiere.Position do
    begin
      c := Random(a * b);
      iia := c * 3;
      Pointeur^[iia]     := 255;
      Pointeur^[iia + 1] := 255;
      Pointeur^[iia + 2] := 255;
    end;

  if Cadre.Checked then
    for i := 0 to a - 1 do
      for j := 0 to b - 1 do
      begin
        c := P2^[(j * a + i) * 3];
        iia := (j * a + i) * 3;
        Pointeur^[iia]     := min(Pointeur^[iia] + c, 255);
        Pointeur^[iia + 1] := min(Pointeur^[iia + 1] + c, 255);
        Pointeur^[iia + 2] := min(Pointeur^[iia + 2] + c, 255);
      end;

  if sauts.Checked and (saut > 0) then
  begin
    for i := 0 to a-1 do
      for j := b-1 downto saut do
      begin
        iia := (j * a + i) * 3;
        iib := ((j-saut) * a + i) * 3;
        Pointeur^[iia]     := Pointeur^[iib];
        Pointeur^[iia + 1] := Pointeur^[iib + 1];
        Pointeur^[iia + 2] := Pointeur^[iib + 2];
      end;
    Saut := 0;
  end;
end;

signaler à un administrateur
Commentaire de Kenavo le 19/06/2007 14:28:14

@F0XI : C'est vrai que le pré-calcul d'indice, sachant qu'il faut agir sur 3 pixels consécutifs, est intéressant. Je suis plus réservé sur l'emploi des shl et shr, qui rendent, à mon avis le source moins clair, surtout que dans ce cas, div 2 ou * 2, le compilateur traduit ces instruction par les rotations !

@FLORENTH : FreeAndNil ! Bon sang mais c'est bien sûr ! Traces résiduelle d'une utilisation massive de Delphi 4 !

Autre remarque :
dans la transformation des couleur en Sépia, j'anticipe la question : "A quoi sert la première ligne ?" (Ici avec l'optimisation de F0XI)
    begin
      Pointeur^[iia + 2] := Pointeur^[iia + 2];
      Pointeur^[iia + 1] := Pointeur^[iia + 2];
      Pointeur^[iia + 0] := TabSepia[Pointeur^[iia + 2]];
    end;
La réponse est : elle ne sert à rien !
Mais, cela permet d'essayer la transformation des couleurs en utilisant comme référence de luminosité une des couleurs fondamentales. Ici (iia + 2) utilise le rouge comme référence, mais on peut remplacer à chaque ligne par (iia + 1) ce qui fera du vert la référence ou (iia + 0) qui utilisera le bleu.
Si on veut faire une transformation plus complète à partie de la luminance réelle, il faut calculer celle ci avec la formule bien connue (?!) Y = 0.299R + 0.587G + 0.114B, ce qui évidemment plomberait les calculs.

Autre question : Connaissez vous un moyen simple de modifier la vitesse de lecture d'un AVI ? Cela permettrait de donner le petit air vieillot des films tournés à la manivelle au environ de 18 à 20 images/seconde et qui sont projetés à 25 images/seconde.

signaler à un administrateur
Commentaire de Renfield le 19/06/2007 15:00:49 administrateur CS

joli...

http://groups.google.fr/group/microsoft.public.win32.programmer.directx.video/browse_thread/thread/804d12a82f91845b/1235096fe6b63e9c?lnk=st&q=change+avi+frame+rate&rnum=1&hl=fr#1235096fe6b63e9c

signaler à un administrateur
Commentaire de cirec le 19/06/2007 15:35:23 administrateur CS

Salut,

je suis comme les autres ... pas de WebCam :(

J'ai donc fait comme Florenth "j'ai transposé l'effet avec getdibits " mais pas tout

pour moi il n'y a pas photo GetDiBits est plus rapide qu'un Scanline et en plus si tu l'utilises avec un PByte à la place
d'un Array[0..0] of Byte les accès sont trois fois plus rapides voir mes commentaires sur la source de
Mauricio : http://www.delphifr.com/codes/GETDIBITS-SETDIBITS-DEMO-SIMPLE_42643.aspx

@ Kenavo :
"Connaissez vous un moyen simple de modifier la vitesse de lecture d'un AVI ?"
si au lieu de modifier la vitesse de lecture de l'AVI tu retires une image toute les 3 où 5 images ?
ca devrait le faire ... non ?

@+
Cirec

signaler à un administrateur
Commentaire de Kenavo le 19/06/2007 16:33:12

Merci à Renfield pour le lien, je vais pouvoir modifier la vitesse de lecture du film.
Un peu de boulot pour adapter les structures, mais ça doit être jouable.

@Cirec : Scanline une fois par image ! C'est pas trop, non ? Et j'utilise bien le PByte
(Le PByte est le type d'origine dans la structure retournée par la fonction callback OnFrame ou OnVideoStream, j'ai donc fait avec).
Mais je vais relire avec attention tes commentaires sur la source de l'ami Mauricio.  

Ken@vo

signaler à un administrateur
Commentaire de Francky23012301 le 19/06/2007 17:06:55

Salut,

Ayant une webcam j'ai pu essayer et ca marche nickel : super code Kénavo ^^.

@+

signaler à un administrateur
Commentaire de WhiteHippo le 20/06/2007 21:59:04

Hello Kenavo

Testé avec 3 webcams dfférentes, une seule concluante, la plus vieille en 320x240... (Les 2 autres ne disposant pas d'un mode RVB 24 ;) Programme et effet plutôt réussi.

P.S. J'ai pas le temps de déboggué le programme, mais j'ai un problème lorsque je configure le TCapture et la webcam en 640x480. J'ai bien une image qui apparait, signe que normallement ok, mais j'obtiens une exception EInvalidGraphicOperation 'Indice ligne hors limites' sur l'affectation de P2 dans Capture1Frame (Affectation du Scanline).

Cordialement.

signaler à un administrateur
Commentaire de Kenavo le 21/06/2007 08:47:32

Salut WhiteHippo

Ça m'étonne que tes webcams ne disposent pas du mode RVB !
Si tu active la ligne (Capture1.SelectFormat dans OnActivate) tu as accès aux paramètres de format de la vidéo.
Ma webcam n'est pas très vielle (Logitech Quickcam Pro 5000)
Pour les vidéos en 640x480, il y a des bugs. Il faut tout d'abord que le bitmap du cadre soit du même format que la vidéo
J'ai ensuite quelques problème d'indices que j'ai corrigé
Il me reste à voir pourquoi en mode enregistrement, en 640 x 480) l'image n'est plus raffraichie à l'écran !
Mise à jour à venir ....

signaler à un administrateur
Commentaire de WhiteHippo le 21/06/2007 13:30:31

Kenavo,

"Si tu active la ligne (Capture1.SelectFormat dans OnActivate) tu as accès aux paramètres de format de la vidéo.
",:
  C'est ce que j'ai fait :)

N.B. Capture1.SelectDisplay provoque également une exception 'Microsoft WDM Image Capture (Win32):Pas de dialogue "Display" pour ce périphérique!'

"Ça m'étonne que tes webcams ne disposent pas du mode RVB !" :
  Celle qui dispose du plus de mode est ma vieille Logitech VCAM-U1 (RGB24,RGB32,YUY2,RGB555 16 bits,I420,YVU9,UYVY). Avec ma Philips SPC900NC/00 juste les modes I420, IYUV (le même quoi ;) et YUY2. Ceci explique peut être les taux qu'elle arrive à atteindre de 60fps, voire 90fps sous certaines conditions. Avec l'autre pas de modes RGB non plus. Mais j'ai des doutes sur celle là quand au driver. Je referais un essai en le réinstallant.

Cordialement.

signaler à un administrateur
Commentaire de Kenavo le 21/06/2007 15:34:26

WhiteHippo,

Il me reste donc à adapter les effets d'images pour le mode I420 (dont je dispose et que je connais un peu).
Je pensais - naïvement, j'en conviens - que le mode RGB était standard.
Pour le sépia ça ne pose pas de problème particulier, puisqu'il doit suffire de modifier les tables U et V en conservant Y
Pour les rayures et les taches pas de problèmes non plus : les modifications portent je pense seulement sur la table Y
Les sauts et glissements peuvent peut-être être réalisés juste sur la table Y puisque les tables U et V devraient être constantes.

J'y jetterais un coup d'oeil dès que j'aurais un moment.

A+

signaler à un administrateur
Commentaire de WhiteHippo le 21/06/2007 19:35:27

Pour information, et pour ceux qui ne connaissent pas le mode I420 (=IYUV) et/ou les autres formats de pixels, un très bon site (en anglais) fait référence : www.fourcc.org

Cordialement.

signaler à un administrateur
Commentaire de Delphiprog le 23/06/2007 23:19:21 administrateur CS

Petite période de nostalgie des années Lumière ? A quand l'impression sur de bonnes vieilles pellicules argentiques ? mdr

Je n'ai rien compris à vos histoires de I420, IYUV et YUY2 et autres sigles mais ce n'est pas grave.

En tous cas, félicitations à Kenavo qui nous sort quelque chose de très original et bien ficelé.

signaler à un administrateur
Commentaire de Kenavo le 24/06/2007 01:41:38

Nostalgie ? Un peu ! Faut quand même être un peu nostalgique pour pratiquer encore le Pascal !
N'empêche que les mariés de cet après midi, pour lesquels j'avais écrit ce code, ont trouvé ces images "transmutées" des plus "jolies"
Va comprendre ces jeunes qui trouvent le vieux rassurant !.....
Et j'espère que WhiteHippo et ses webcam ont trouvé leur bonheur dans la dernière version

signaler à un administrateur
Commentaire de WhiteHippo le 24/06/2007 10:58:50

Kenavo,

Tout roule pour le mode I420 ou presque ;P. Si tu décoches tout il faut quand même sortir le plumeau à cause des poussières. Il manque un "if poussieres.Checked then" à la ligne 247. Bref, rien de bien grave.

P.S. Merci d'avoir passé du temps à coder le mode I420.

Cordialement.

signaler à un administrateur
Commentaire de amirrazi506 le 28/08/2007 16:43:34

Salut Kenavo

MERCI pour touts
moi amirrazi506

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

[Webcam] probleme ecran bleu [ par ffomnislash ] hello. J'&#233;cris un programme en Delphi me permettant de visualiser le flux vid&#233;o d'un webcam. J'utilise pour cela le composant que voici: h Msn webcam [ par bobizumi ] Salut!J'aimerais savoir si on pouvait (avec un programme ou wathever) changer de webcam ou de source vid&#233;o durant une conversation vid&#233;o msn pointeurs [ par plusweb ] Bonjour,j'aurai besoin d'aide concernant les pointeurs...C'est ma deuxieme ann&#233;e de pratique de delphi et j'attaque les pointeurs... J'ai trois e Détecter Fin de WindowsMediaPlayer [ par Also know as ] Bonjour, Voil&#224; je me renseigne pour savoir s'il &#233;tait possible de d&#233;tecter quand le lecteur Windows Media &#224; fini de lire sa vid&# Insérer une image dans une autre ... [ par Yil2201 ] Salut! Voila, l&#224; je bosse sur un soft qui sert &#224; faire des photos avec sa webcam. Aucun probl&#232;me, je recois bien l'image webcam. J'ai v tableau de variables dans une fonction afin de les schtroumpfer sans pointeurs ... [ par f0xi ] Salut a tous!aller autant faire le boulet jusqu'au bout en postant dans la tristement celebre rubrique "BORDELAYARGLAFOUK".j'ai recement rencontrer un Webcam, keylogger et renvoi d'ip avec IdTCPClient1 et IdTCPServer1 [ par ewertheimer ] Bonjour, Je voudrais creer un logiciel client/serveur(IdTCPClient1/IdTCPServer1). Je vous explique je voudrais que le serveur, dés qu'il sera activé r Surveillance par caméra [ par benStNarsRepresent ] Je suis présentement en stage et j'ai pour tâche de faire un système de surveillance par caméra. Je test tous avec des webcam. J'aurais bien aimé mett Webcam et site internet [ par justodge ] bonjour &#224; tous, je suis dans un projet et je cherche &#224; visualiser une webcam sur un site internet cr&#233;er avec le serveur apache.comment durée fichier vidéo [ par Bestdoud ] Bonjour,existe-t-il un moyen de connaître rapidement la durée d'une vidéo gérée par windows ainsi que d'un gif animé ?merci


Nos sponsors

Sondage...

CalendriCode

Septembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
2930     

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,36 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.