Я пытаюсь приспособить 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, который возвращался через секунду.
Может кто-то помочь мне, пожалуйста? Заранее спасибо.
at<>()
Функция медленная. Если скорость важна, то не рекомендуется использовать ее внутри циклов. Возьмите указатель вне цикла, а затем просто используйте этот указатель внутри цикла.
Смежный вопрос:
Доступ к массиву OpenCV Mat, какой путь самый быстрый и почему?