Fusonner 2 images avec OpenCV

Résolu
cs_hakimus Messages postés 25 Date d'inscription samedi 14 octobre 2006 Statut Membre Dernière intervention 8 juillet 2010 - 26 juin 2007 à 16:42
cs_hakimus Messages postés 25 Date d'inscription samedi 14 octobre 2006 Statut Membre Dernière intervention 8 juillet 2010 - 29 juin 2007 à 14:54
Bonjour a tous,


je programme en C et j'utilise la bibliotheque openCV pour bricoler des images.

Mon probleme est simple et precis :  j'ai besoin d'ajouter une petite image ET du texte sur une plus grande image.


L'objectif est de rajouter l'heure et un petit logo sur des images provenant d'une webcam.


C'est pas faute d'avoir cherche, mais impossible de trouver une fonction openCV faisant ca!

Ca m'a pourtant l'air simple et je suis sur qu'on doit pouvoir le
faire. Je sais qu'on peut le faire avec la SDL, mais j'aimerais eviter
d'avoir a utiliser deux bibliotheques graphiques differentes dans mon
programme...


Donc voila, si un pro de l'openCV passe par la et a une idee sur la facon de proceder, je lui serais bien reconnaissant.


Merci d'avance

3 réponses

katsankat Messages postés 571 Date d'inscription vendredi 30 décembre 2005 Statut Membre Dernière intervention 12 juillet 2012 3
28 juin 2007 à 09:32
Salut,

Ce procédé s'appelle texture splatting ou encore blending. J'ai écrit une appli en GTK qui superpose 4 textures avec des masques alpha, c'est ultra rapide comme méthode.

Aujourd'hui j'ai besoin du même programme que toi, pour ajouter un copyright sur des centaines de photos à publier.

Ca me parait assez simple sans opencv. Il suffit de bien connaître les types d'images (bmp, jpg, png ...) pour parcourir les pixels. Mais là ou ça devient intéressant c'est que tu peux parcourir facilement les pixels avec opencv.

Exemple: placer un logo BMP de 64x64 pixels sur une image BMP de 1024x768 pixels, en bas à droite à 10 pixels des bords.

Parcourir les pixels de la grande image. De son header on connait la largeur des lignes, le nombre de lignes et de colonnes.

Le coin supérieur gauche de la petite image sera donc sur la colonne
    1024 - 64 - 10 = 970
et sur la ligne
    768 - 64 - 10  = 694

Si c'est un bmp à 3 channels, on se positionne direct sur l'octet
    970 x 694 x 3 = 2019540

A partir de là, faire une boucle imbriquée pour remplacer les pixels de la grande par le pixel du logo. Il faut boucler sur la largeur et la hauteur de la petite image (ici 64 x 64). Enregistrer le nouveau bmp et c'est dans la boite!

Pour ajouter l' heure, un masque alpha peut être envisageable. Créer une petite image qui contient l'heure en noir sur blanc. Lors de la boucle imbriquée (elle même imbriquée), si le pixel est blanc, ne rien faire. Sinon remplacer le pixel de la grande image par celui de la petite.

Je crois bien que je vais m' y mettre en GTK+ parce qu'il dispose des fonctions qui vont bien pour lire/écrire quantité de formats de fichiers et surtout d'éccéder aux pixels. Le principe est le même pour toi avec opencv!
3
katsankat Messages postés 571 Date d'inscription vendredi 30 décembre 2005 Statut Membre Dernière intervention 12 juillet 2012 3
28 juin 2007 à 09:42
Voilà un code qui est très bon.

I can break the rules too, goodbye.
0
cs_hakimus Messages postés 25 Date d'inscription samedi 14 octobre 2006 Statut Membre Dernière intervention 8 juillet 2010
29 juin 2007 à 14:54
Ma parole mais c'est vrai!



Les fonctions d'openCV sont si pratiques que j'en avais oublie d'essayer de le faire moi meme.[Javascript:Insert_Emoticon('/imgs2/smile_big.gif'); ]



Pixel par pixel ca marche tres bien, et on peut meme ignorer le fond blanc par exemple.


Par contre ce serait complique pour afficher l'heure, mais heureusement j'ai trouve la fonction openCV qui s'en charge :

CvFont font;
cvPutText (myImg,"My text",cvPoint(x,y), &font, cvScalar(b,g,r));


Merci de m'avoir ouvert les yeux en tout cas ^^
0