Я хочу применить tanh
функцию к каждому элементу OpenCV Matrix.Реализация Vaniall с использованием вложенных циклов for дает правильные результаты.
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]
Реализация параллельного цикла с использованием в соответствии с указаниями здесь .
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]
Я не могу отследить проблему реализации здесь.