Код разработан для ядра нечетного размера и не будет работать без больших модификаций для ядер четного размера. Скорее всего, это причина ваших прочтений. Я рекомендую сделать ядро нечетного размера, добавив при необходимости строку и / или столбец нулей.
Ваши записи за пределами допустимого размера происходят из-за того, что copy_output
отличается от размера copy_input
, Предполагая, что вы инициализировали его, как указано в другом ответе (Mat copy_output(input.rows,input.cols,input.type())
, тогда
copy_output.at<float>(y,x) = sum;
записывает вне границ, потому что x
и y
становятся больше, чем input.rows
и input.cols
. Любая инициализация copy_output
к размеру дополненного входного изображения (результат cv::copyMakeBorder
), или напишите по адресу:
copy_output.at<float>(y-kernel.rows/2,x-kernel.cols/2) = sum;
Обратите внимание, что round
в вашем коде лишний, kernel.rows/2
является целочисленным делением, дающим целое число. round
ничего не делает с целым числом.