Вы получаете доступ к данным как 2-компонентный двойной вектор (используя .at<cv::Vec2d>()
), но вы создали матрицы, содержащие только один компонентный двойной тип (используя CV_64FC1
). Либо создайте матрицы, содержащие два компонента на элемент (с CV_64FC2
), либо, что кажется более подходящим для вашего кода, получите доступ к значениям в виде простых двойных чисел, используя .at<double>()
. Это взрывается ровно при j = 133, потому что это вдвое меньше вашего изображения, а когда рассматривается как содержащий двухкомпонентные векторы, когда оно содержит только 1, оно только вдвое меньше.
Или, может быть, вы можете объединить эти две матрицы в одну, содержащую два компонента на элемент, но это зависит от того, как вы собираетесь использовать эти матрицы в будущем. В этом случае вы также можете объединить два цикла и установить двухкомпонентный вектор:
cv::Mat f = cv::Mat(paddedHeight,paddedWidth,CV_64FC2);
float yValue = -n/2.0f;
for(int i=0;i<n;i++)
{
float xValue = -n/2.0f;
for(int j=0;j<n;j++)
{
f.at<cv::Vec2d>(i,j)[0] = xValue++;
f.at<cv::Vec2d>(i,j)[1] = yValue;
}
++yValue;
}
Это может привести к лучшей схеме доступа к памяти, если вам всегда нужны оба значения, одно из fx и одно из fy, для одного и того же элемента.