我想在OpenCV Matrix的每个元素上应用tanh
函数。使用嵌套for循环的Vaniall实现可以得到正确的结果。
Mat P(Size(3,3),CV_64FC1,Scalar(2));
Mat P1 = P.clone();
for( int i = 0 ; i < 3 ; ++i )
{
for( int j = 0 ; j < 3 ; ++j )
{
P1.at<double>(i,j) = tanh(P1.at<double>(i,j)) ;
}
}
cout<<P1<<endl;
输出正确:
[0.9640, 0.9640, 0.9640;
0.9640, 0.9640, 0.9640;
0.9640, 0.9640, 0.9640]
根据指南here使用并行循环实现。
class Parallel_pixel_opencv : public ParallelLoopBody
{
private:
uchar *p ;
public:
Parallel_pixel_opencv(uchar* ptr ) : p(ptr) {}
virtual void operator()( const Range &r ) const
{
for ( register int i = r.start; i != r.end; ++i)
{
p[i] = (uchar)tanh( p[i] ) ;
}
}
};
int main()
{
Mat P(Size(3,3),CV_64FC1,Scalar(2));
Mat P2 = P.clone();
uchar* p3 = P2.data ;
parallel_for_( Range(0,3*3) , Parallel_pixel_opencv(p3)) ;
cout<<P2<<endl;
}
输出
[7.2911227e-304, 2, 2;
2, 2, 2;
2, 2, 2]
我无法在此处追踪实施问题。
答案 0 :(得分:0)
使用char *指针而不是double *指针应该解释错误的结果。
可是:
(1)我不相信3x3矩阵的并行操作可以提高性能。
(2)cv :: Mat有一个forEach方法,可以与C ++ 11 lambdas一起使用。这应该更简单。有关示例,请参阅https://www.learnopencv.com/parallel-pixel-access-in-opencv-using-foreach/。