7
votes

Placez une image sur une image

Je veux placer une image sur un cadre vidéo capturé aux coordonnées que j'ai déterminées.

J'ai demandé cela auparavant et on m'a dit d'utiliser CVCopy et cvsetimageroi mais je ne veux pas recadrer sur ces coordonnées, je veux ajouter une autre image. Peut-être que c'est la bonne façon, mais je ne l'ai pas compris (si sa bonne s'il vous plaît expliquez-le).


0 commentaires

4 Réponses :


0
votes

Vous devrez copier pixel par pixel de la source vers la destination. Le code ci-dessous suffit précisément que, compensation avec coordonnées x et y . Je n'ai pas vraiment essayé cela, mais je suis assez certain qu'il devrait fonctionner plus ou moins que vous vous attendez.

Assurez-vous simplement que l'image cible est au moins la taille de la source et le décalage! < Pré> xxx


7 commentaires

Merci mais je veux combiner toutes les sources à x, y pixels de la cible, je pense que je dois ajouter 2 pour les boucles à votre code, les boucles de votre code obtiennent les valeurs R, G, B de la source et de l'autre 2 j'ajouterai changera les objectifs RVB est-il correct


Le code ci-dessus va parcourir tous les pixels de l'image source et les copier un par un à une position de décalage sur l'image cible. Il n'y a pas besoin de boucles supplémentaires, sauf si vous avez l'intention de copier plusieurs iplimage S sur la cible.


ok je forst de votre code merci j'ai déjà une boucle pour une image multiple, je pense que vous ne me compreniez pas que je veux faire exactement le contraire de votre code ce que je veux faire est de remplacer une partie de mon image source avec une autre image


Simplement échanger le iplimage S dans les paramètres pour accomplir cela. Essentiellement ce que vous devez faire, est de faire la vidéo capturée comme cible , une image que vous souhaitez superposer en tant que source et spécifiez le x et y offset où vous souhaitez que l'image soit placée sur la vidéo. Étant donné que la vidéo cible est transmise avec un pointeur, vous pouvez ensuite procéder au processus vidéo capturé après avoir appelé DrawImage () .


Paul je viens d'utiliser votre code avant votre dernier commentaire que je remplace les cibles et les sources les uns avec les autres dans le code, mais l'image que je veux mettre est placée, mais sur une autre coordonnée et que Lenghten, je veux beaucoup le mettre sur mon programme de détection des yeux, j'ai mis un image noire aux yeux mais au lieu des yeux, il est apparu sur la tête si vous voulez que je puisse vous sén vous le code


@Eomer j'ai reçu votre e-mail, mais ça ne vous dérange pas si je réponds ici. Il y a un moyen plus simple de copier des images pixel-by-pixel. Le code précédent était spécifique aux images à trois canaux. J'ai mis à jour mon code en conséquence. Donnez-lui une balançoire et laissez-moi savoir si cela fonctionne ou non.


Ce n'est pas rapide. Vous pouvez vous améliorer en utilisant les fonctions réel Obtenir / définir des fonctions, meilleure utilisation @ OLA's Code.



7
votes

Je l'ai fait il y a quelque temps avec Setroi, c'était quelque chose comme ça. J'ai deux images, l'une est une vignette appelée thumb_frame qui est la petite image que je comprendra dans la grande image show_frame xxx

qui en est à peu près.


1 commentaires

Pourquoi CVADDPORTÉE ()? Je pense que cvcopy () est ce qui est requis.



6
votes
cvOverlayImage(largerimage, overlayimage, cvPoint(10, 10), cvScalar(0.5,0.5,0.5,0.5), cvScalar(0.5,0.5,0.5,0.5)); 
//The cvPoint(10,10) can be the cvPoint(varX,varY) depending on how you write the function 
//and how you want to use it. 
//You cannot choose values less than 'varX' and 'varY' in this case
//else you would see a runtime error.

6 commentaires

Merci George. Je ne peux vraiment pas comprendre comment utiliser les outils d'édition ici. Je peux écrire un code compliqué mais ne peut pas faire ces choses simples :). Qu'avez-vous utilisé pour souligner mon code? J'ai essayé et


Hé avec cette solution si l'image de superposition a une très grande largeur et une très grande hauteur, il ne recouvre pas l'image juste! Pourriez-vous suggérer une méthode dans laquelle l'image de superposition est réparée et adaptée à la zone fixe.


@PAvank Pourquoi n'avez-vous d'utiliser CVResize () si refermement l'image entière? , Si vous souhaitez utiliser une partie de l'image et redimensionnez cette partie, vous devrez définir ROI, Copier, Échelle, réinitialiser ROI. Jetez un coup d'oeil à un exemple ici Nashruddin.com/opencv_region_of_interest_(ROI) [Copier et coller lien - y compris les crochets, sinon ne fonctionnera pas]


@enthausiastickeek Oui J'ai essayé cette approche et cela ne fonctionne bien que pour les rectangles. Y a-t-il un moyen de l'adapter dans un polygone avec 4 sommets? J'ai essayé d'utiliser warp_matrix mais j'ai bien fonctionné bien. Ma question est ici ici Stackoverflow.com/Questtions/9997544/...


@Pavank Pouvez-vous ne pas appliquer de masque comme l'exemple suivant? Nashruddin.com/opencv_circular_oin


Mise à jour lien Stackoverflow.com/questions / 10632195 / ...



0
votes

Malheureusement, le code "Paul Lammertsma" a mélangé des index ici, vous avez un code fixe:

void drawImage(IplImage* target, IplImage* source, int x, int y) {

    for (int ix=0; ix<source->width; ix++) {
        for (int iy=0; iy<source->height; iy++) {
            int r = cvGet2D(source, iy, ix).val[2];
            int g = cvGet2D(source, iy, ix).val[1];
            int b = cvGet2D(source, iy, ix).val[0];
            CvScalar bgr = cvScalar(b, g, r);
            cvSet2D(target, iy+y, ix+x, bgr);
        }
    }
}


0 commentaires