您可以通过将src1
,src2
和转换dst
为float (CV_32F)
类型矩阵来实现此目的。这是因为代码在float* ptrs[3];
.
使用opencv
函数的替代实现log
,multiply
最后exp
给出。
作为您的第二个问题的示例,
Mat src1 = (Mat_<int>(3, 3) <<
1, 2, 3,
4, 5, 6,
7, 8, 9);
Mat src2 = (Mat_<uchar>(3, 3) <<
1, 2, 3,
1, 2, 3,
1, 2, 3);
Mat dst = (Mat_<float>(3, 3) <<
1, 2, 3,
4, 5, 6,
7, 8, 9);
src1.convertTo(src1, CV_32F);
src2.convertTo(src2, CV_32F);
cout << "before\n";
cout << dst << endl;
const Mat* arrays[] = { &src1, &src2, &dst, 0 };
float* ptrs[3];
NAryMatIterator it(arrays, (uchar**)ptrs);
for( size_t i = 0; i < it.nplanes; i++, ++it )
{
for( size_t j = 0; j < it.size; j++ )
{
ptrs[2][j] = std::pow(ptrs[0][j], ptrs[1][j]);
}
}
cout << "after\n";
cout << dst << endl;
输出
before
[1, 2, 3;
4, 5, 6;
7, 8, 9]
after
[1, 4, 27;
4, 25, 216;
7, 64, 729]
如果您删除src1.convertTo(src1, CV_32F);
or src2.convertTo(src2, CV_32F);
,您将无法获得所需的结果。尝试一下。
如果这是一个单独的函数,请不要将 放在convertTo
函数中,因为它会修改图像表示,这可能会影响以后的操作。相反,convertTo
在临时垫上使用,比如
Mat src132f, src232f, dst32f;
src1.convertTo(src132f, CV_32F);
src2.convertTo(src132f, CV_32F);
dst.convertTo(dst32f, CV_32F);
pow_mat(&src132f, &src232f, &dst32f); /* or whatever the name */
至于你的第一个问题,我不知道有这样的功能。但你可以尝试类似的东西
Mat tmp;
cv::log(src1, tmp);
cv::multiply(src2, tmp, dst);
cv::exp(dst, dst);
使用c = a^b
等价于的关系c = e^(b.ln(a))
。在这里,矩阵应该有类型32F
or 64F
。这产生
[1, 4, 27.000002;
4, 25.000002, 216.00002;
6.9999995, 64, 729.00006]
对于上面的例子。