OpenCV で複素数値の行列方程式を実装しようとしています。私は正常に動作するMATLABでプロトタイプを作成しました。方程式から始めます (正確な MATLAB 実装):
kernel = exp(1i .* k .* Circ3D) .* z ./ (1i .* lambda .* Circ3D .* Circ3D)
その中で
1i = complex number
k = constant (float)
Circ3D = real-valued matrix of known size
lambda = constant (float)
.* = element-wise multiplication
./ = element-wise division
結果は、複素数値の行列です。必要な Circ3D マトリックスを CV_32F として生成することに成功しましたが、複素数 i による乗算が問題を引き起こしています。OpenCV のドキュメントから、複雑な行列は単純に 2 チャネルの行列 (CV_32FC2) であることを理解しています。
本当の問題は、i を定義する方法にあります。私はいくつかのオプションを試しましたが、その中で i を次のように定義しています
cv::Vec2d complex = cv::Vec2d(0,1);
次に、行列を掛けます
kernel = complex * Circ3D
しかし、これは機能しません (期待していませんでしたが)。std::complex で何かをする必要があると思いますが、何がわかりません( http://docs.opencv.org/modules/core/doc/basic_structures.html )。
助けてくれてありがとう。
編集: この投稿を書いた直後に、 i を次のように定義することで、いくつかの進歩を遂げました。
std::complex<float> complex(0,1)
次に、次のように複雑な値を割り当てることができます。
kernel.at<std::complex<float>>(i,j) = cv::exp(complex * k * Circ3D.at<float>(i,j)) * ...
z / (complex * lambda * pow(Circ3D.at<float>(i,j),2));
ただし、これはループで機能するため、手順が非常に遅くなります。一発でできる方法はありますか?