OpenCV Parallel для реализации вопроса - PullRequest
0 голосов
/ 19 мая 2018

Я хочу применить 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]

Я не могу отследить проблему реализации здесь.

1 Ответ

0 голосов
/ 19 мая 2018

Использование указателя char * вместо двойного * указателя должно объяснить неправильный результат.

Но:

(1) Я не верю, что параллельная операция для матрицы 3x3 повышает производительность.

(2) В cv :: Mat есть метод forEach, который можно использовать с лямбдами C ++ 11.Это должно быть проще.См. https://www.learnopencv.com/parallel-pixel-access-in-opencv-using-foreach/ для примера.

...