首页 > 解决方案 > 带有负元素的 OpenCV Mat 的 pow

问题描述

我试图将一些代码从转换MATLABc++withOpenCV但我被困在这一行: MATLAB代码:

t3 = real((ISimMatrix .* QSimMatrix) .^ 0.02)

我用 C++ 重新实现了这一行:

cv::Mat t2, t3;
t2 = ISimMatrix.mul(QSimMatrix);
cv::pow(t2, lambda, t3); 

两者ISimMatrixQSimMatrix都是可能包含负数的 2D 双矩阵,问题是当它们的倍数为 0.02 时,MATLAB结果是 2D 复数矩阵,但OpenCV结果是Mat_<double>某些元素是 nan,这会导致所有下一次计算出错。

如何实现支持负电源的 pow 功能?

谢谢。

标签: c++matlabopencv

解决方案


当然,使用不同的库可能是一种选择,但是在对 c++ 中的复数进行了一些搜索之后,我编写了简单的函数来解决问题:

inline cv::Mat cpow(cv::Mat m, double o) {
    cv::Mat_<cv::Vec2f> out = cv::Mat_<cv::Vec2f>(m.rows, m.cols);
    for (size_t i = 0; i < m.rows; i++)
    {
        for (size_t j = 0; j < m.cols; j++)
        {           
            std::complex<double> b(m.at<double>(i, j), 0);
            std::complex<double> p(o, 0);
            std::complex<double> r = std::pow(b, p);
            out.at<cv::Vec2f>(i, j) = cv::Vec2f(r.real(), r.imag());
        }
    }
    return out;
}

推荐阅读