我是OpenCV的新手。我很困惑(从我的天真 Angular 来看...)

我正在尝试将零矩阵的区域设置为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,并且保持不变。这显然会导致内存错误。我检查了top,bottom,right和left的值,它们在范围之内。

我确信我缺少一些基本的知识,如果有人指出这一点将是无穷的帮助。

最佳答案

最明显的解释是patternHeight或patternWidth为0,因此在行上将blackImg替换为空图像:

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

如果我正确理解了您在该行要做什么(用黑色像素填充blackImg?),则应改用:
blackImg.setTo(0);

关于c++ - cv::Mat对象中的空数据字段,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37977270/

10-12 23:50