0

次の式に従ってOpenCVで行列計算を実行したいと思います。

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

OpenCVでこれを行う簡単な方法はありますか、それともforループでこれを計算する必要がありますか?私にとっての主な問題はexp(Matrix)です。

よろしく

4

3 に答える 3

3

わかりました、私は自分で答えを見つけました、誰かが同じ問題を抱えている場合のコードはここにあります:

newMat = float(scalar) * ( float(otherScalar) - newMat);
cv::exp( newMat, newMat );
newMat= 1.0f / ( 1.0f + newMat);
于 2012-10-11T09:44:33.860 に答える
3

Maeckyの答えは完全に問題ありません-1チャンネルの画像の場合。

画像に複数のチャンネルがある場合、楽しみが始まります。いくつかの理由で、

float(scalar) - _3ChannelMat

乗算中、最初のチャネルにのみ演算を適用します

float(scalar2) * _3channelMat

画像のすべてのチャンネルで行われます。おかしいですね。

解決策は、cv :: Scalarsを使用することです:

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

私はこの奇妙な振る舞いについて少し前にバグを報告しましたが、まだ答えはありません。

于 2012-10-11T11:16:40.037 に答える
0

@Maeckyは、答えにバグを書いた可能性があります。

1+A通常はを意味I+Aし、1 / Aは反転(つまりA ^ {-1})を意味します。ここIで、は単位行列です。matlabおよびopencvではeyeと呼ばれます。(さらにF / A === F * A ^ {-1})

あなたのソリューションではnewMat、目ではなく、すべて1つの行列(matlabおよびopencvでは行列と呼ばれます)を追加しています。

正しく(つまり、(I + exp(scalar *(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();
于 2012-11-26T21:55:28.867 に答える