Fusonner 2 images avec OpenCV [Résolu]

Signaler
Messages postés
25
Date d'inscription
samedi 14 octobre 2006
Statut
Membre
Dernière intervention
8 juillet 2010
-
Messages postés
25
Date d'inscription
samedi 14 octobre 2006
Statut
Membre
Dernière intervention
8 juillet 2010
-
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

Messages postés
571
Date d'inscription
vendredi 30 décembre 2005
Statut
Membre
Dernière intervention
12 juillet 2012
3
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!
Messages postés
571
Date d'inscription
vendredi 30 décembre 2005
Statut
Membre
Dernière intervention
12 juillet 2012
3
Voilà un code qui est très bon.

I can break the rules too, goodbye.
Messages postés
25
Date d'inscription
samedi 14 octobre 2006
Statut
Membre
Dernière intervention
8 juillet 2010

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