在c++中拟合二维高斯函数太慢

Fitting 2d gauss function in C++ too slow

本文关键字:高斯 二维 函数 c++ 拟合      更新时间:2023-10-16

我正在尝试将2d高斯函数适合图像(cv::Mat格式),我正在使用NLopt库。

我把我的对象函数像这样:

for(i for each row)
    for(j for each col)
    {
        //compute the gauss function value
        double valuenow=x[0]*exp(-( x[3]*(j-x[1])*(j-x[1]) + 2*x[4]*(j-x[1])*(i-x[2]) + x[5]*(i-x[2])*(i-x[2]) ));
        //add square residual to result
        result+=(valuenow-fitdata.at<double>(i,j))*(valuenow-fitdata.at<double>(i,j));
    }
return result;

我的矩阵大约是1000*1000的大小,我使用LN_COBYLA算法。当我运行这个程序时,发现它非常慢。我认为我指定目标函数的方式一定有问题,因为我曾经在Matlab中使用lsq非线性做同样的事情,它在一秒钟内返回。

有人能帮我一下吗?提前感谢。

at<>()函数运行缓慢。如果速度是至关重要的,那么在循环中使用速度并不是一个好主意。在循环外获取一个指针,然后在循环内使用该指针。

一个相关问题:OpenCV Mat数组访问,哪种方式是最快的,为什么?