2017-03-04 18 views
1

快速摘要:MatCell在OpenCV中设置为NULL?

我创建了一个简历::垫由

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?

让我知道是否需要更多信息,谢谢!

+1

使用'cout << int(c [j])<< endl;'。您正在打印ASCII字符,而不是值。 ('NULL'只是'0')。并且'map.ptr (y)[x]'可以简单地改写为'map.at (y,x)',或者如果使用'Mat1b'作为'map(y,x) – Miki

+0

@Miki这实际上打印0的,谢谢。后续问题;为什么我会得到和以前一样的结果(unsigned char)c [j],但是如果我使用int(c [j]),我会得到实际的0值? 我有一个bug,我收集并从垫子读取int的,但我想要无符号的字符。当垫填充1时,这会给我4个以下单元格的内容的数值。 –

+0

如果您打印'uchar'数据,您将获得ASCII值。要获得实际值,可以将其转换为“int”。由于'uchar'是1个字节,'int'是4个字节,所以如果你在'uchar *'中赋值'int',那么你实际上正在写入4个'uchar's。 – Miki

回答

0

问题现在已经解决了,这里是我以供将来参考错误:

1:打印时,@ Miki指出,无符号字符 - > ASCII值被打印,而不是数字表示。 2:在isAllowedPosition(bool res,int x,int y)中,res具有原始类型。也就是说,它被推入堆栈,而不是对内存位置的引用。在写入时,我写入本地副本而不写入作为参数传入的副本。

两种可能的修复方法,或者将指针传递给内存位置并写入内存位置,或者直接返回结果。

+0

或只是“返回资源;” – Miki

0

由于您的数据类型为uchar(又名unsigned char),因此您正在打印ASCII值。使用

cout << int(c[j]) << endl; 

打印实际值。


而且map.ptr<unsigned char>(y)[x]可以简单地改写为map.at<uchar>(y,x),或者如果您使用Mat1bmap(y,x)

+0

isAllowed(res,0,0)将仍然返回假。我相应地改变了方法,在比较之前将其转换为int。 unsigned char * c = map.ptr (y); int cellval = int(p [x]); res = cellval == int(0); –

+0

您需要将其转换为int才能打印出值,而不是在处理中。 – Miki

+0

我解决了它,非常感谢您的帮助@Miki。 :) –