在 OpenCV 2.3 中为 Mat 数组赋值的问题 - 看起来很简单

Posted

技术标签:

【中文标题】在 OpenCV 2.3 中为 Mat 数组赋值的问题 - 看起来很简单【英文标题】:Problem assigning values to Mat array in OpenCV 2.3 - seems simple 【发布时间】:2011-09-04 11:03:33 【问题描述】:

使用 OpenCV 2.3 的新 API,我无法将值分配给循环内的 Mat 数组(或说图像)。这是我正在使用的代码 sn-p;

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

请指教!谢谢!

【问题讨论】:

【参考方案1】:

您正在以 2 分量双精度向量的形式访问数据(使用 .at&lt;cv::Vec2d&gt;()),但您创建的矩阵仅包含 1 个分量双精度(使用 CV_64FC1)。要么创建矩阵以包含每个元素的两个组件(使用CV_64FC2),或者,似乎更适合您的代码,使用.at&lt;double&gt;() 将值作为简单的双精度值访问。这恰好在 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 的值)用于同一个元素,这可能会产生更好的内存访问方案。

【讨论】:

以上是关于在 OpenCV 2.3 中为 Mat 数组赋值的问题 - 看起来很简单的主要内容,如果未能解决你的问题,请参考以下文章

opencv如何给单通道的Mat赋值

opencv学习-第四节:图像对象的创建与赋值

opencv mat的数据类型CV_32FC1变成CV_8UC1

OpenCV中对Mat的遍历访问与赋值

02OpenCV数据载入显示与保存

OpenCV的Mat对象如何定义数组?