Fusonner 2 images avec OpenCV [Résolu]

cs_hakimus 25 Messages postés samedi 14 octobre 2006Date d'inscription 8 juillet 2010 Dernière intervention - 26 juin 2007 à 16:42 - Dernière réponse : cs_hakimus 25 Messages postés samedi 14 octobre 2006Date d'inscription 8 juillet 2010 Dernière intervention
- 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
Afficher la suite 

3 réponses

Répondre au sujet
katsankat 577 Messages postés vendredi 30 décembre 2005Date d'inscription 12 juillet 2012 Dernière intervention - 28 juin 2007 à 09:32
+3
Utile
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!
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de katsankat
katsankat 577 Messages postés vendredi 30 décembre 2005Date d'inscription 12 juillet 2012 Dernière intervention - 28 juin 2007 à 09:42
0
Utile
Voilà un code qui est très bon.

I can break the rules too, goodbye.
Commenter la réponse de katsankat
cs_hakimus 25 Messages postés samedi 14 octobre 2006Date d'inscription 8 juillet 2010 Dernière intervention - 29 juin 2007 à 14:54
0
Utile
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 ^^
Commenter la réponse de cs_hakimus

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.