在OpenCV 2.3中为Mat数组赋值的问题 - 似乎很简单

时间:2011-09-04 11:03:34

标签: opencv matrix variable-assignment

使用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,我得到一个异常,这似乎与图像的深度有关,我无法弄清楚我在这里做错了什么。

请指教!谢谢! Error is here

1 个答案:

答案 0 :(得分:7)

您正在以双组分双向量(使用.at<cv::Vec2d>())访问数据,但您创建的矩阵仅包含1个组件双精度数(使用CV_64FC1)。要么创建矩阵以包含每个元素的两个组件(使用CV_64FC2),要么更适合您的代码,使用.at<double>()将值作为简单的双精度访问。这恰好在j = 133处爆炸,因为它是图像大小的一半,当它仅包含1时,当被视为包含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的值),这可能会产生更好的内存访问方案。