216 messages | - Niveau de bricolage en "électronique" : débutant
- Niveau de programmation (pour la réalisation d'un logiciel optionel) : expert
- Matériel nécessaire : Un périphérique de capture Video sur le PC avec entrée composite (exemple : carte graphique VIVO)
But de cette idée Bricolage :
La Capture Video de l'Oric, s'effectuera en temps réel sur le PC, vous bénéficierez ainsi des fonctionnalités suivantes :
- Affichage de votre Oric en temps réel sur l'écran de votre PC dans votre environnement d'exploitation préféré (Windows, Linux...)
- Possibilité d'enregistrer des séquences videos de vos exploits sur Oric (démos, high-score du siècle, demonstration d'astuces de programmations ne fonctionnant que sur de vrais Oric mais pas sur émulateur, possibilité d'utiliser en même temps votre WIndows (ou LInux) et votre Oric sur le même moniteur, etc...
- Travailler/Jouer avec son PC et son Oric sur le même écran
- Plus besoin de peritel, pas besoin de convertisseur RGB-->VGA
-possibilité de faire une "box" (à base d'un petit PC silencieux) qui prenne en entrée le signal video de l'oric et restitue en sortie différents types de signaux avec une connectique "standard" pour une sortie au choix sur TV, magnétoscope, moniteur de PC
- Dans cet article, la partie son (liée à la video) n'est pas abordée mais reste envisageable.
Idée folle aux avantages multiple mais réalisable :
Et en couleur en plus pour peu que vous soyez veré dans la programmation !
Pour ce faire vous aurez besoin du matériel suivant :
- avoir une carte graphique VIVO sur le PC ou une carte d'acquisition video (30 euros environs) : il y a toujours une entrée composite "Video in" !
- Fabriquer un cable RVB-composite selon les indications données dans le Theoric n°8 page 36 (c'est facile, j'ai réussi à en faire un, c'est dire... et ça marche très bien !). Vous trouverez ce magazine en téléchargement sur www.Eurix.fr ou bien www.abandonware-magazine.org (voir notre rubrique "nos sites favoris").
Fabrication du cable :
Le cable présenté dans Théoric ne permet qu'une sortie composite en noir et balnc (et non pas couleur) : c'est là où le niveau expert est requis !
Si vous en restez à la fabrication du cable, n'importe quel logiciel de capture video fera l'affaire, par contre, vos videos serons en noir et blanc !
D'après l'article de Théoric, le niveau de Gris de l'image composite sera calculé comme ceci :
Niveau_de_Gris=0.3*Rouge+0.59*Bleu+0.11*Vert
Donc, à chaque niveau de gris (très distincts les uns des autres), correspondra une et une seule couleur de l'Oric (c'est cette particularité ce qui pourra nous permettre de recoloriser l'image)
0% --> noir
11% --> vert
30%-->rouge
41% (obtenue avec les composantes vertes et rouge, don égal à 0.3*1+0.11*1) -->jaune
59% -->bleu
70% (vert+bleu) --> cyan
89% (rouge+bleu) -->magenta
100% -->blanc
Rectifions tout de suite l'article de Theoric :
Il serait plus logique d'obtenir les dégradés de gris selon cette formule :
Niveau_de_Gris=0.3*Rouge+0.59*Vert+0.11*Bleu (bref, on inverse le vert et le bleu)
Dans le montage proposé par Theoric, celà se traduit par l'inversion des résistances Rv (celle pour le signal"vert") et Rb (celle pour le signal"bleu")
Pourquoi ?
parce qu'ainsi, du plus foncé au plus clair nous aurons alors :
0% -->Noir
11%-->Bleu
30%-->Rouge
41%-->Magenta
59%-->Vert
70%-->Cyan
89%-->Jaune
100%-->Blanc
C'est drôlement plus logique d'avoir le bleu proche du noir plutôt que le vert, et le Jaune proche du blanc, plutôt que le magenta
Avec le montage de Theoric, votre jaune sera plus foncé que votre bleu, là non !
Si vous avez réalisé correctement votre cable, vous pouvez le tester en reliant votre Oric sur un Téléviseur (un adaptateur péritel peu parfaois s'avérer nécessaire si celui-ci ne possède pas d'entrée composite), ou bien sur l'entrée "Video In" de votre PC (logiciel de capture video nécessaire)
Vous devriez obtenir alors une image claire, nette et stable, mair en noir et blanc.
Réalisation du logiciel :
Cette partie s'adresse aux experts de la programmation.
Ne connaissant que peu Linux, hélas, je ne puis vous aider, par contre, sous Windows, oui.
Notre logiciel de capture maison doit être capable de :
-Capturer la video provenant de la carte graphique.
- Coloriser chaque frame
- Restituer l'image (sur l'écran ou dans un fichier)
Sous windows, celà se traduit par l'utilisation de DirectShow en passant successivement par les filtres suivant
- le filtre de capture (géré par DirectShow)
- un "Sample Grabber Filter" : ce Sample Grabber Filter va permettre d'intercepter les frames et de les modifier (pour les coloriser)
- le filtrer de rendu video (ou "Video Renderer", géré aussi par DirectShow)
Réalisation du "Sample Grabber Filter" (je remercie un forumeur de www.developpez.com pour cette idée) :
Je cite :
-Il faut CoCreainstance pour récupérer le Sample Grabber Filter
-L'ajouter au filter graph
-Faire un grabber->query (...ISampleGrabber...)
-Faire un Igrabber->SetBufferSamples(False)
-Faire:
AM_MEDIA_TYPE mt;
ZeroMemory(&mt, sizeof(AM_MEDIA_TYPE));
mt.majortype = MEDIATYPE_Video;
mt.subtype = MEDIASUBTYPE_RGB24;
Igrabber->SetMediaType(&mt);
-Connecter l'entrée du grabber au filtre source et la sortie au filtre de rendu video
-Creer une classe MyCallBAck qui implémente l'interface ISampleGrabberCB et implémenter la méthode HRESULT SampleCB(double SampleTime, IMediaSample *pSample);
-Faire un Igrabber->SetCallback(mycallback, 0)
Au final ta transformation niveaugris->couleur se fait dans la méthode SampleCB en récupérant le tableau de unsigned char réprésentant limage 24bit et la taille, à partir du parametre IMediaSample.
En bonus tu as meme le timestamp (= temps où la frame a été créée )
Modification d'une Frame :
Maintenant, maintenant que nous pouvons accéder à chaque frame, il s'agit de les modifier pour les recoloriser
L'image qui arrive de la capture, est composée de pixels ayant chacun une composante Rouge, verte et bleue.
Théoriquement, chaque composante possède une valeur comprises entre 0 et 255.(pour rappel un point d'une image bitmap est codé avec 3*1octet=24bits= 1 octet de Rouge, 1 octet de Vert, 1 de bleu).
Bien, de chaque point de cette image grisée, il s'agit d'extraire la composante rouge (par exemple), elle pourra prendre en théorie 8 valeurs différentes :
255*0%=0 (correspondant au niveau de gris du noir)
255*11%=28 (correspondant au niveau de gris du Bleu)
255*30%=76 Rouge
255*41%=104 Magenta
255*59%=150 Vert
255*70%=178 Cyan
255*89%=227 Jaune
255*100%=255=blanc
En pratique, le signal que l'on récupère est "dégradé", les gris et les couleurs ont un peu bavé, donc un pixel gris représentant du vert n'aura pas forcément une valeur "28" comme on pourrais s'y attendre, mais plutôt une valeur comprise entre 25 et 31(28-4<x<28+4).
Nous pouvons bien sur voir plus large et dire qu'une valeur de la composante Rouge (ou Verte ou Bleue) du pixel de notre Frame correspondante au niveau de gris issu du Bleu aura forcément une valeur comprise entre 15 et 50.
Ce qui nous donne comme table de correspondance :
Composantes R, G ou B de la frame : Couleur Oric corespondante : NouvelleValeur RGB du Pixel colorisé
entre 0 et 14 Noir R=0 G=0 B=0
entre 15 et 51 Bleu R=0 G=0 B=255
entre 52 et 90 Rouge R=255 G=0 B=0
entre 91 et 127 Magenta R=255 G=0 B=255
entre 128 et 189 Vert R=0 G=255 B=0
entre 190 et 202 Cyan R=0 G=255 B=255
entre 203 et 240 Jaune R=255 G=255 B=0
entre 241 et 255 Blanc R=255 G=255 B=255
bref, il n'y a plus qu'a traduire chacune des valeurs de gris au niveau du PC pour reconstituer une image couleur correspondant à l'écran de notre Oric, in Live, avec possibilité d'enregistrer une video
Pour votre information, je compte me lancer dans cette réalisation, sitôt "Le Héros de San José" terminé. Développant en Delphi, j'utiliserais très certainement une bibliothèque de composant appelée DSPack.
En tout cas, je suis sur que si vous avez un tant sois peu de notions en C++ ou Delphi ou autre, que vous arrivez à manipuler les pixels d'une image Bitmap, vous arriverez à vous en sortir. Le nombre de tutoriels à propos de l'utilisation de DirectShow pour ce genre d'application ne manquent pas !
|
Auteur: nom ou pseudo...
| |