41

OpenCV に 2 つの Mat イメージがあります。

Mat ft = Mat::zeros(src.rows,src.cols,CV_32FC1);
Mat h = Mat::zeros(src.rows,src.cols,CV_32FC1);

両方の画像は同じ寸法で、単一のソース画像から計算されます。

これら2つの画像を乗算したいのですが、両方を使用してみました

Mat multiply1 = h*ft;

Mat multiply2;
gemm(h,ft,1,NULL,0,multiply2);

ただし、どちらも次のアサーション エラーが発生します。

OpenCV エラー: 不明な関数でアサーションが失敗しました (a_size.width == len), ファイル ...matmul.cpp 'cv::exception' をスローした後に終了が呼び出されました

私は何を間違っていますか?

4

1 に答える 1

125

行列は同じ次元であると言いますが、行列の乗算を実行しようとしています。同じ次元の行列の乗算は、それらが正方である場合にのみ可能です。あなたの場合、寸法が正方形ではないため、アサーション エラーが発生します。乗算には 2 つの意味があるため、行列を乗算するときは注意が必要です。

行列の乗算は、2 つの行列が直接乗算される場所です。この演算は、サイズ [axb​​] の行列 A とサイズ [bxc] の行列 B を乗算して、サイズ [axc] の行列 C を生成します。OpenCV では、単純な*演算子

C = A * B

要素ごとの乗算では、出力マトリックスの各ピクセルは、マトリックス A のピクセルにマトリックス B の対応するエントリを乗算することによって形成されます。入力マトリックスは同じサイズである必要があり、出力も同じサイズになります。これは、次のmul()関数

output = A.mul(B);
于 2012-06-08T12:34:10.140 に答える