cv::Mat 对象中的空数据字段

Posted

技术标签:

【中文标题】cv::Mat 对象中的空数据字段【英文标题】:Null Data field in cv::Mat object 【发布时间】:2016-06-22 20:04:41 【问题描述】:

我是 OpenCV 的新手。我遇到了一个难题(从我幼稚的角度来看......)

我正在尝试将零矩阵的区域设置为 1。实质上执行以下操作:

Mat a = Mat::zeros(10, 10, CV_8UC1);
Mat b = Mat::ones(3, 3, CV_8UC1);

Range h = Range(2, 5);
Range w = Range(2, 5);

b.copyTo(a(h, w));

我检查了这个确切代码的输出,它工作正常。当我尝试在我的实际代码中执行此操作时,问题就出现了:

int key, top,left,bottom,right;
Mat blackImg = Mat::zeros(imgHeight, imgWidth, CV_8UC1);
Mat whiteBox = Mat::ones(patternHeight, patternWidth, CV_8UC1);
while (true) 
    blackImg = Mat::zeros(patternHeight, patternWidth, CV_8UC1);

    top = patternPosY;
    bottom = patternPosY + patternHeight;
    left = patternPosX;
    right = patternPosX + patternWidth;

    Range h = Range(top, bottom);
    Range w = Range(left, right);

    whiteBox.copyTo(blackImg(h, w));

    imshow("Pattern", blackImg);
    // key inputs
    key = waitKey(30);

    if (key == 27) 
        break;
    

但是,blackImg Mat 对象的数据字段为 NULL,并且保持不变。这显然会导致内存错误。我检查了顶部、底部、右侧和左侧的值,它们在界限内。

我确信我遗漏了一些基本的东西,如果有人能指出来,那将非常有帮助。

【问题讨论】:

请编辑您的问题以显示重现您的问题的代码的minimal 数量。您的代码当前无法编译,因为您的某些常量缺少声明和值。 @Miki 他每次迭代都重新分配blackImg,因为他想从空白图像开始。 blackImg 在迭代期间被修改。他应该改为删除对blackImg 的初始分配并在循环中声明它。 【参考方案1】:

最明显的解释是patternHeight或patternWidth为0,所以blackImg在该行替换为空图:

blackImg = Mat::zeros(patternHeight, patternWidth, CV_8UC1);

如果我正确理解您在该行尝试做什么(用黑色像素重新填充 blackImg?),您应该改用:

blackImg.setTo(0);

【讨论】:

以上是关于cv::Mat 对象中的空数据字段的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV 中的矩阵乘法 - 结合 cv::Mat 和 cv::Scalar 对象

如何在不复制数据的情况下将 cv::Mat 转换为 2d std::vector

试图将 cv::Mat 数据复制到 uchar *

OpenCV实战——OpenCV核心数据结构

opencv 将数据从 *Mat 复制到 Mat

我可以将 cv::Mat 作为 JPEG 数据写入命名管道吗?