web-dev-qa-db-ja.com

Opencv乗算スカラーと行列

Matlabでは、かなり簡単で些細なことを達成しようとしています。

私は単に次のようなものを達成したいです:

cv::Mat sample = [4 5 6; 4 2 5; 1 4 2];
sample = 5*sample;

その後、サンプルは次のようになります。

[20 24 30; 20 10 25; 5 20 10]

私はscaleAddMulMultiplyを試しましたが、どちらもスカラー乗数を許可せず、同じ「サイズとタイプ」の行列を必要とします。このシナリオでは、One of Matrixを作成してから、scaleパラメーターを使用できますが、これは非常に無関係なようです。

どんな直接的な簡単な方法も素晴らしいでしょう!

14
Arpan Shah

OpenCVは実際、オーバーロードされたoperator*を使用したスカラー値による乗算をサポートしています。ただし、マトリックスを正しく初期化する必要がある場合があります。

float data[] = {1 ,2, 3,
                4, 5, 6,
                7, 8, 9};
cv::Mat m(3, 3, CV_32FC1, data);
m = 3*m;  // This works just fine

主に数学演算に関心がある場合は、cv::Matxの方が扱いが簡単です。

cv::Matx33f mx(1,2,3,
               4,5,6,
               7,8,9);
mx *= 4;  // This works too
18
Aurelius

大きなマットには forEach を使用する必要があります。

C++ 11が利用可能な場合:

m.forEach<double>([&](double& element, const int position[]) -> void
{
element *= 5;
}
);
2
Black Arrow

このようなもの。

Mat m = (Mat_<float>(3, 3)<<
                    1, 2, 3,
                    4, 5, 6,
                    7, 8, 9)*5;
1
SPV

Javaの場合、演算子のオーバーロードはありませんが、MatオブジェクトはconvertToメソッドで機能を提供します。

Mat dst= new Mat(src.rows(),src.cols(),src.type());
src.convertTo(dst,-1,scale,offset);

このメソッドのドキュメントはこちら

1
J.E.Tkaczyk
Mat A = //data;//source Matrix
Mat B;//destination Matrix
Scalar alpha = new Scalar(5)//factor
Core.multiply(A,alpha,b);
0
Syed Safdar Ali