我创建了一个简历::垫由
cv::Mat m = cv::Mat::zeros(MAP_HEIGHT, MAP_WIDTH, CV_8UC1)
我的做法之后,这是看我是否在多边形的名单有任何多边形,如果我这样做,以填补他们,最后我将m赋值给我的公共cv :: Mat映射(在头文件中定义)。 会发生什么情况基本上是:
cv::Mat m = cv::Mat::zeros(MAP_HEIGHT, MAP_WIDTH, CV_8UC1);
// possibly fill polygons with 1's. Nothing happens if there are no polygons
map = m;
我的程序的逻辑是位置x,如果0被占用小区Y是允许的。所以没有多边形=>所有的地图应该是'合法的'。
我已经定义了这个方法来检查给定的x-y坐标是否被允许。
bool Map::isAllowed(bool res, int x, int y) {
unsigned char allowed = 0;
res = (map.ptr<unsigned char>(y)[x] == allowed);
}
现在神秘开始了。
cout << cv::countNonZero(map) << endl; // prints 0, meaning all cells are 0
for(int i = 0; i < MAP_HEIGHT; i++) {
unsigned char* c = map.ptr<unsigned char>(i);
for(int j = 0; j < MAP_WIDTH; j++) {
cout << c[j] << endl;
}
} // will print nothing, only outputs empty lines, followed by a newline.
如果我打印(C [J] == NULL)它打印1. 如果我打印整个垫我看到的只是0的闪烁在我的屏幕上,所以他们是明显存在的。
为什么isAllowed(bool,x,y)在(0,0)返回false时,在那里显然是0?
让我知道是否需要更多信息,谢谢!
使用'cout << int(c [j])<< endl;'。您正在打印ASCII字符,而不是值。 ('NULL'只是'0')。并且'map.ptr(y)[x]'可以简单地改写为'map.at (y,x)',或者如果使用'Mat1b'作为'map(y,x) –
Miki
@Miki这实际上打印0的,谢谢。后续问题;为什么我会得到和以前一样的结果(unsigned char)c [j],但是如果我使用int(c [j]),我会得到实际的0值? 我有一个bug,我收集并从垫子读取int的,但我想要无符号的字符。当垫填充1时,这会给我4个以下单元格的内容的数值。 –
如果您打印'uchar'数据,您将获得ASCII值。要获得实际值,可以将其转换为“int”。由于'uchar'是1个字节,'int'是4个字节,所以如果你在'uchar *'中赋值'int',那么你实际上正在写入4个'uchar's。 – Miki