OpenCV Parallel 的实现问题

标签 opencv c++11 image-processing

我想在 OpenCV 矩阵的每个元素上应用 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]

我无法在此处找到实现问题。

最佳答案

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

但是:

(1) 我认为 3x3 矩阵的并行运算不会提高性能。

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

关于OpenCV Parallel 的实现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50421403/

相关文章:

c++ - 如何通过另一个具有位置的垫子访问opencv中的矩阵数据(索引)

c++ - 结合两个正则表达式c++0x

c++ - 为什么 std::map::const_iterator 在 std::for_each 期间调用 std::pair 构造函数,而简单的 for 循环却不调用?

opencv - 定向梯度对象检测的直方图

linux - opencv在odroid中安装错误

android - 使用 android.hardware.camera2 设置自定义分辨率和帧率

performance - 纹理上传速度是多少?

image-processing - 检查一张图片是否在另一张图片上的某处/相似的最佳方法是什么?

python - 如何提取洗衣机前面板的轮廓?

c++ - 读取小端 16 位无符号整数