使用 OpenCV 2.3 的新 API 时,我在为循环内的 Mat 数组(或图像)赋值时遇到问题。这是我正在使用的代码片段;
int paddedHeight = 256 + 2*padSize;
int paddedWidth = 256 + 2*padSize;
int n = 266; // padded height or width
cv::Mat fx = cv::Mat(paddedHeight,paddedWidth,CV_64FC1);
cv::Mat fy = cv::Mat(paddedHeight,paddedWidth,CV_64FC1);
float value = -n/2.0f;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
fx.at<cv::Vec2d>(i,j) = value++;
value = -n/2.0f;
}
meshElement = -n/2.0f;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
fy.at<cv::Vec2d>(i,j) = value;
value++;
}
现在,在第一个循环中,一旦 j = 133,我就得到一个异常,该异常似乎与图像的深度有关,我无法弄清楚我在这里做错了什么。
Please Advise! Thanks!
您正在以 2 分量双向量的形式访问数据(使用.at<cv::Vec2d>()
),但是您创建的矩阵仅包含 1 个分量双精度(使用CV_64FC1
)。创建矩阵以每个元素包含两个分量(使用CV_64FC2
)或者,什么似乎更适合您的代码,使用简单的双精度访问值.at<double>()
。它恰好在 j=133 处爆炸,因为这是图像大小的一半,并且当它仅包含 1 时被视为包含 2 分量向量时,它的宽度只有一半。
或者,您可以将这两个矩阵合并为一个,每个元素包含两个分量,但这取决于您将来使用这些矩阵的方式。在这种情况下,您还可以将两个循环合并在一起并真正设置一个 2 分量向量:
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 的值),这可能会产生更好的内存访问方案。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)