Acquisition video (webcam, tv cards ...)

4/5 (62 avis)

Vue 49 763 fois - Téléchargée 5 825 fois

Description

J'ai essayé de réécrire un composant d'acquisition vidéo en utilisant les fonctions de la DLL AviCap32.dll, et en restant au plus près de ces fonctions.
Les derniers sources que nous avons vu ici, usaient (et abusaient) de copier-coller pour présenter dans un TImage une vidéo rendue invisible à sa création !
Il y a ici, une utilisation des fonctions callback pour générer les évènements,
Il y a en plus, un bitmap intégré au composant qui permet de faire de l'incrustation de texte et de dessin dans l'image vidéo.

La démo présente deux points principaux :

1 - Incrustation
L'incrustation est obtenue en utilisant le canvas d'un bitmap du composant. Lors des évènements générés par les fonctions callback, lorsqu'il y a accès au buffer image captée (OnFrame et OnVideoStream), on fusionne ce buffer et les pixels du bitmap. J'encourage chaque utilisateur à écrire ses propres alogorithmes de fusion, selon ses besoins.
On peut ansi visualiser une capture avec incrustation ou enregistrer un flux vidéo avec incrustation

2 - Analyse d'image et détection de mouvement
Cette analyse est effectuée à chaque nouvelle trame, et si un mouvement est détecté, un cadre est ajouté à l'image vidéo par incrustation

Conclusion :


Limitations :

- Pas d'enregistrement des incrustations si on utilise un codec vidéo de compression (comme DivX, Intel IYUV ou autre). (le flux est probablement détourné avant de parvenir au composant)

(Z'avez vu la capture de la capture de la capture de la capture de la capture de la capture de la capture de la capture de la capture .....)

Codes Sources

A voir également

Ajouter un commentaire Commentaires
defis91 Messages postés 65 Date d'inscription samedi 29 octobre 2005 Statut Membre Dernière intervention 8 août 2011
25 avril 2011 à 20:44
Salut Kenavo,
5 ans après, la mise à disposition de ton composant bien utile, encore une remarque.
A l'époque je l'avais utilisé pour une détection de mouvement qui fonctionnait parfaitement.
Interfacé à un servo moteur, la caméra suivait les déplacements.
Je reprends ce programme pour le lancer à heure fixe et j'ai un petit problème.
Après avoir fait un capture.disconnect on ne peut pas faire un capture.connect sans le déclanchement d'une erreur fatale.
Une idée ?
Merci
Dom EFIS.
sebnet06 Messages postés 2 Date d'inscription samedi 18 novembre 2000 Statut Membre Dernière intervention 31 mars 2010
31 mars 2010 à 10:05
Merci Kenavo,
Sa marche impeccable.
cs_Kenavo Messages postés 702 Date d'inscription vendredi 21 mars 2003 Statut Membre Dernière intervention 1 octobre 2009 4
30 mars 2010 à 19:03
Salut,

Je crois que tu as des erreurs dans la récupération des valeurs U et V

// calcul des indices
n := (H * W) + ((j div 2) * (W div 2) + (i div 2));
m := (H div 2) * (W div 2) + n;

// Lecture des valeurs
U := pointbyte[n];
V := pointbyte[m];

Amuse-toi bien !

Ken@vo
sebnet06 Messages postés 2 Date d'inscription samedi 18 novembre 2000 Statut Membre Dernière intervention 31 mars 2010
30 mars 2010 à 17:42
Bonjour,

Merci pour ce composant.
J'aimerai copier l'affichage de ma camera sur un bitmap, mon problème est que elle utilise un format (IYUV et I420) et je ne parvient pas a recuperer les bonnes couleurs.

Je fait parcourir i de 0 à (Bitmap.height -1) et j de 0 à (Bitmap.width -1)
J'utilise un Bitmap de 120*160.

Y := pointbyte[i*160+j];
U := pointbyte[(i div 2)*(160 div 2) +j div 2 +(i*j)];
V := pointbyte[(i div 2)*(160 div 2) +j div 2 +(i*j) +(i*j)div 4];

Ensuite j'utilise la formule de conversion de YUV en RGB :

//Red
R := trunc(1.164*(Y - 16) + 1.596*(V - 128));
if R < 16 then R := 0;
if R > 255 then R := 255;

//Green
G := trunc(1.164*(Y - 16) - 0.813*(V - 128) - 0.391*(U - 128));
if G < 0 then G := 0;
if G > 255 then G := 255;

//Blue
B := trunc(1.164*(Y - 16) + 2.018*(U - 128));
if B < 0 then B := 0;
if B > 255 then B := 255;

et j'affiche sur mon bitmap le resultat :

Image1.Picture.Bitmap.canvas.Pixels[j,i] := RGB(R,G,B);

Je pense que je récupère mal mes composant YUV.
Quelqu'un a t' il la solution a mon problème?

Merci.
cs_krzysiu Messages postés 22 Date d'inscription mardi 13 juillet 2004 Statut Membre Dernière intervention 3 septembre 2011
27 févr. 2010 à 08:33
Bonjours,

merci pour ce composant qui fonctionne parfaitement.
J'aurais souhaiter pouvoir récupérer la valeur des couleurs des pixel en RGB dans le flux vidéo, pour pouvoir détecter la présence d'un objet de couleur. Quelqu'un aurait'il un début de piste ? Merci
Afficher les 62 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.