OpenCV Parallel实现问题

时间:2018-05-19 03:10:10

标签: opencv c++11 image-processing

我想在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]

我无法在此处追踪实施问题。

1 个答案:

答案 0 :(得分:0)

使用char *指针而不是double *指针应该解释错误的结果。

可是:

(1)我不相信3x3矩阵的并行操作可以提高性能。

(2)cv :: Mat有一个forEach方法,可以与C ++ 11 lambdas一起使用。这应该更简单。有关示例,请参阅https://www.learnopencv.com/parallel-pixel-access-in-opencv-using-foreach/