IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenCV Discussion :

Modification du canal alpha


Sujet :

OpenCV

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Mai 2009
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 10
    Par défaut Modification du canal alpha
    Bonjour, je voudrais travailler avec le 4eme channel d'une image IplImage.
    J'expose l'idée, j'ai mon image obtenu par le flux webcam

    cvGrabFrame(capture);
    image=cvRetrieveFrame(capture);
    etc,etc...

    et a cette image je voudrais ajouter une sorte de réalité augmentée, j'ai une image .gif (donc qui gere le canal Alpha) disons une image de crayon sur fond "transparent" que je voudrais poser par dessus mon flux video.
    De facon a ce que avec un suivi de main par exemple, on puisse déplacer le crayon.

    J'ai un peu du mal a gerer ce canal alpha.

    J'ai essayé avec cvSplit puis cvSet(im1_alpha, cvScalar(128),NULL ) suivi de cvMerge mais cela n'a pas fonctionné.

    Merci du coup de pouce

  2. #2
    Membre confirmé
    Inscrit en
    Juin 2003
    Messages
    223
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juin 2003
    Messages : 223
    Par défaut
    Malheureusement, il n'y a rien qui gère ça de façon efficace:

    Je te propose d'utiliser une fonction que j'ai fait pour ma librairie, ça combine les channels R,G,B de image1 et image2 selon la transparence dans image2.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
     
    /**
    * @brief Add src2 on src1 using src2 alpha channel (transparency).
    * 
    * @code
    * foreach(c=channels)
    *      dst[I,c] = src1[I,c]*(1-(src2[I,alpha]/255)) + src2[I,c]*(src2[I,alpha]/255)
    * end
    * @endcode
    * 
    * @param src1 The first source array (background image, 3 or 4 channels)
    * @param src2 The second source array (transparent image, 4 channels minimum)
    * @param dst The destination array (merge image, 3 or 4 channels).
    * @note This function only works with IPL_DEPTH_8U image for the moment.
    */
    void x7sAddAlphaLayer_3C4C8U(const IplImage *src1, const IplImage *src2, IplImage *dst)
    {
     
    	uint8_t *p_im1, *p_im2,*end,*p_dst;
    	int nChan_im1, nChan_dst, c;
    	float tmp, ratio;
     
     
    	//Set the pointers.
    	p_im1 =  (uint8_t*)src1->imageData;
    	p_im2 =  (uint8_t*)src2->imageData;
    	p_dst = (uint8_t*)dst->imageData;
    	end = p_im2 + src2->imageSize; //4 Channels (Include Alpha)
     
    	nChan_im1 = src1->nChannels;
    	nChan_dst = dst->nChannels;
     
     
    	//loop by 2 pixels
    	while(p_im2<end)
    	{
     
    		//Compute the ratio for this pixel.
    		ratio=(float)(p_im2[3]/255.f);
     
    		//Chan 0
    		c=0;
    		tmp=((float)(p_im1[c]))*(1-ratio) + ((float)(p_im2[c]))*(ratio);
    		p_dst[c]=(uint8_t)(tmp+0.5f);
     
    		//Chan 1
    		c=1;
    		tmp=((float)(p_im1[c]))*(1-ratio) + ((float)(p_im2[c]))*(ratio);
    		p_dst[c]=(uint8_t)(tmp+0.5f);
     
    		//Chan 2
    		c=2;
    		tmp=((float)(p_im1[c]))*(1-ratio) + ((float)(p_im2[c]))*(ratio);
    		p_dst[c]=(uint8_t)(tmp+0.5f);
     
    		//Chan Alpha
    		if(nChan_dst==4)
    		{
    			if(nChan_im1!=4) p_dst[3]=255;
    			else 		p_dst[3]=p_im1[3];
    		}
     
     
    		//Jump to next pixel
    		p_im1+=nChan_im1;
    		p_im2+=4;
    		p_dst+=nChan_dst;
    	}
    }

Discussions similaires

  1. [Free Pascal] [SDL] Blit et canal alpha
    Par PMdomine dans le forum Free Pascal
    Réponses: 0
    Dernier message: 07/11/2008, 18h59
  2. Canal alpha, supprimer totalement un fonc unis sous flash 8
    Par daudinsabrina dans le forum Intégration
    Réponses: 0
    Dernier message: 29/02/2008, 11h34
  3. Le multitexturing .. en canal alpha par exemple
    Par Sébastien P dans le forum OpenGL
    Réponses: 0
    Dernier message: 04/01/2008, 10h53
  4. Réponses: 6
    Dernier message: 11/05/2007, 08h54
  5. FLV et Canal Alpha
    Par Olish dans le forum Flash
    Réponses: 3
    Dernier message: 31/05/2006, 08h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo