Установка 2d функции Гаусса в C++ слишком медленная

Я пытаюсь приспособить 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 с lsqnonlinear, который возвращался через секунду.

Может кто-то помочь мне, пожалуйста? Заранее спасибо.

1 ответ

at<>() Функция медленная. Если скорость важна, то не рекомендуется использовать ее внутри циклов. Возьмите указатель вне цикла, а затем просто используйте этот указатель внутри цикла.

Смежный вопрос: доступ к массиву OpenCV Mat, какой путь самый быстрый и почему?

Другие вопросы по тегам