複素行列の絶対値を取得する方法について誰か助けてもらえますか。行列には、あるチャンネルに実数値が含まれ、別のチャンネルに虚数値が含まれています。可能であれば、例を挙げてください。
よろしくお願いします
XとYの2つのコンポーネント、同じサイズとタイプの2つの行列があると仮定します。あなたの場合、それは実数/im値である可能性があります。
// n rows, m cols, type float; we assume the following matrices are filled
cv::Mat X(n,m,CV_32F);
cv::Mat Y(n,m,CV_32F);
次のように、各複素数の絶対値を計算できます。
// create a new matrix for storage
cv::Mat A(n,m,CV_32F,cv::Scalar(0.0));
for(int i=0;i<n;i++){
// pointer to row(i) values
const float* rowi_x = X.ptr<float>(i);
const float* rowi_y = Y.ptr<float>(i);
float* rowi_a = A.ptr<float>(i);
for(int j=0;j<=m;j++){
rowi_a[j] = sqrt(rowi_x[j]*rowi_x[j]+rowi_y[j]*rowi_y[j]);
}
}
OpenCV phasecorr.cpp モジュールを見ると、すでにこれを行っており、共役対称性がパックされた DFT 結果も処理する magSpectrums という関数があります。ヘッダーファイルによって公開されているとは思いませんが、コピーするのは簡単です。速度が気になる場合は、使用可能な SIMD オプションをオンにしてコンパイルするようにしてください。これらのオプションによって、この計算に大きな違いが生じる可能性があるからです。