我是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/