begin process at 2010 02 10 10:28:46
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Périphériques

 > WEBCAM À MANIVELLE

WEBCAM À MANIVELLE


 Information sur la source

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
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é :8 353 / 1 135

Auteur : Kenavo

Ecrire un message privé
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

Les Membres Club peuvent 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

 Sources du même auteur

RÉELS ET RÉALITÉ
Source avec Zip Source avec une capture ACQUISITION VIDEO (WEBCAM, TV CARDS ...)
Source avec Zip Source avec une capture IMAGE EN FOND DE PANEL
Source avec Zip LE RÉSEAU MICROSOFT - LES FONCTIONS WNET
Source avec Zip Source avec une capture AYEZ DE BONS RAPPORTS AVEC VOS RÉSISTANCES

 Sources de la même categorie

Source avec Zip Source avec une capture EXTRAIRE PÉRIPHÉRIQUE USB ( HOTPLUG ) par yanb
Source avec Zip Source avec une capture LOGICIEL INTERRUPTEUR MONDIAL USB par ced55957
Source avec Zip Source avec une capture RETIRER LES PÉRIPHÉRIQUES USB par yanb
Source avec Zip CHARGER ET ENVOYER DES DONNÉES VIA L'USB par ldesmartin
Source avec Zip Source avec une capture GESTION DU CLAVIER G15 DE LOGITECH par delphitness

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture IMAGE WEBCAM SUR SITE WEB. par titout2
Source avec Zip WEBCAM TCHAT ET VIDEOCONFÉRENCE par titout2
Source avec Zip TÉLÉ SUR LE RÉSEAU . par titout2
Source avec Zip Source avec une capture ACQUISITION VIDEO (WEBCAM, TV CARDS ...) par Kenavo
Source avec Zip LES POINTEURS : LE PETIT JEU DU SERPENT... par PyRuSs

Commentaires et avis

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;

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.

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

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

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

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 ^^.

@+

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.

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 ....

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.

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+

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.

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é.

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

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.

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 recuperer le flux vidéo [ par norton ] hello, comment dois-je faire pour recupérer le flux vidéo c'est pour un prog de géstion de réseau d entreprise.je mettrai le code ici quand il sera te lecture vidéo [ par lupoo ] salut à tous, je suis en train d'utiliser TMediaplayer, et tout fonctionne bien. Mais je voudrais maintenant pouvoir lire les vidéos à différentes vit dessiner sur un flux vidéo [ par lupoo ] hello,je n'arrive pas à faire apparaître du dessin sur l'image vidéo, elle s'impose toujours par dessus le dessin...comment faire pour inverser cela?m image prise par une webcam [ par ludou ] bonjour voilà je cherche comment on pourrait améliorer la qualités d'une image prise par une webcam et comment on pourrait voir si elle est trop fonçé webcam [ par aliwassem ] bienvenueVotre texte ICIVotre texte ICIsalut mes amis Webcam [ par Kaaloos ] J'ai vu le composant camera et c fort, mais ,voilà si KLK1 pourrait m'aider sur le moyen de l'utiliser pour prendre des photos :(capture + affichage s Ecrire sur une vidéo ??? [ par jmp77 ] Bonjour à tous et toutes,Voila mon problème est que je voudrais pouvoir écrire sur une vidéo en meme temps qu'elle défile. Ecrire un tlabel j'ai essay


Nos sponsors


Sondage...

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), 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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,983 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales