【发布时间】:2012-11-28 14:12:56
【问题描述】:
我正在尝试在 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 文档中,我了解到复杂矩阵只是一个两通道矩阵 (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));
但是,这在循环中工作,这使得过程非常缓慢。有什么方法可以一次性完成吗?
【问题讨论】: