gpt4 book ai didi

OpenCV Parallel 的实现问题

转载 作者:太空宇宙 更新时间:2023-11-03 23:10:54 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com