c++ - 带有负元素的 OpenCV Mat 的 pow
问题描述
我试图将一些代码从转换MATLAB
为c++
withOpenCV
但我被困在这一行:
MATLAB
代码:
t3 = real((ISimMatrix .* QSimMatrix) .^ 0.02)
我用 C++ 重新实现了这一行:
cv::Mat t2, t3;
t2 = ISimMatrix.mul(QSimMatrix);
cv::pow(t2, lambda, t3);
两者ISimMatrix
和QSimMatrix
都是可能包含负数的 2D 双矩阵,问题是当它们的倍数为 0.02 时,MATLAB
结果是 2D 复数矩阵,但OpenCV
结果是Mat_<double>
某些元素是 nan,这会导致所有下一次计算出错。
如何实现支持负电源的 pow 功能?
谢谢。
解决方案
当然,使用不同的库可能是一种选择,但是在对 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;
}
推荐阅读
- javascript - 是否有任何 DOMstring 元素没有存储在新变量中以进行进一步处理的原因?
- vb.net - 在运行时使用 vb.net 更改 Cystal 报告中详细信息部分中的公式字段的颜色
- laravel - Laravel 5.3 中 RouteCollection.php 第 161 行中的 NotFoundHttpException
- c++ - 我可以扩展 std::map::lower_bound 以搜索非 key_type 参数吗?
- android - 如何使用其 REST API 在 Android 上访问 Google Drive 上的应用程序数据
- javascript - 使用 javascript 向元素添加事件侦听器
- c# - Virustotal Trapmine 可疑.low.ml.score
- c++ - 是否可以将 X 的容器声明为 X 的成员
- android - 使用 ndk arm-linux-androideabi-clang++ 编译器为 android 构建 grpc C++
- javascript - 空调功能