2012-10-11 6 views
0

Je veux effectuer un calcul de Matrix à OpenCV selon cette formule:OpenCV utilisation exp avec Mat

newMat = 1/(1 + exp(scalar * (otherScalar - Matrix))) 

est-il un moyen facile de le faire dans OpenCV ou dois-je calculer cela dans une boucle ? Le principal problème pour moi est l'exp (Matrix).

Cordialement

Répondre

3

La réponse de Maecky est parfaitement bien - pour les images 1 canal.

Le plaisir commence si votre image a plus d'un canal. Pour certaines raisons,

float(scalar) - _3ChannelMat 

applique l'opération que sur le premier canal, alors que la multiplication

float(scalar2) * _3channelMat 

se fait sur tous les canaux de l'image. C'est drôle, n'est-ce pas?

La solution est d'utiliser cv :: Scalaires:

newMat = cv::Scalar(0.4, 0.4, 0.4) * (cv::Scalar(255, 255, 255) - _3channelMat); 

J'ai déposé un bug il y a un moment sur ce comportement étrange, mais pas encore de réponse.

+0

Merci d'avoir signalé cela. Dans mon cas, j'ai juste besoin d'une chaîne, mais c'est bon à savoir - juste au cas où. – Maecky

2

Ok, je l'ai trouvé la réponse moi-même, voici le code si quelqu'un a le même problème:

newMat = float(scalar) * (float(otherScalar) - newMat); 
cv::exp(newMat, newMat); 
newMat= 1.0f/(1.0f + newMat); 
+0

1.0f/Mat ne division élément par élément. Si ce n'est pas ce que vous voulez - et votre formule de tapis dans la question est assez familier pour moi -, vérifiez ma réponse pour l'expression correcte. –

0

@Maecky les chances sont que vous venez d'écrire un bug dans votre réponse.

1+A signifie généralement I+A et 1/A signifie l'inversion (qui est un^{- 1}) où I est la matrice d'identité - appelée oeil dans Matlab et OpenCV. (De plus F/A === F * A^{- 1})

Dans votre solution, vous ajoutez une matrice tout-un à newMat (appelée dans matlab et dans opencv), pas d'œil.

correctement (qui calcule (I + exp (scalaire * (* otherScalar I-Matrix)))^{- 1}):

using namespace cv; 
Size s = Matrix.size(); 
int t = Matrix.type(); 
Mat newMat; 
Mat I = Mat::eye(s,t); 

exp(scalar * (otherScalar*I - Matrix), newMat); 
newMat = (I + newMat).inv();