MatC单元在OpenCV中设置为NULL?

时间:2017-03-04 18:05:28

标签: c++ opencv null mat

快速摘要:

我通过

创建了一个cv :: Mat
cv::Mat m = cv::Mat::zeros(MAP_HEIGHT, MAP_WIDTH, CV_8UC1)

我的方法是看看我是否在多边形列表中有任何多边形,如果我这样做,请填写它们,最后我将m分配给我的public cv :: Mat map(在头文件中定义) )。 基本上会发生什么:

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;

我的程序的逻辑是,如果0占用单元格,则允许位置x,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时?

如果需要更多信息,请告诉我,谢谢!

2 个答案:

答案 0 :(得分:0)

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

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

打印实际值。

同样map.ptr<unsigned char>(y)[x]可以简单地重写为map.at<uchar>(y,x),或者Mat1b使用map(y,x)

答案 1 :(得分:0)

问题现在解决了,以下是我的错误以供将来参考:

1:打印时,@ Miki指出无符号字符 - &gt;打印ASCII值,而不是数字表示。

2:在isAllowedPosition(bool res,int x,int y)中,res具有基本类型。 Aka被推入堆栈而不是对memorylocation的引用。写信的时候,我写的是本地副本而不是作为参与者传入的副本。

两种可能的修复方法,要么传入指向内存位置的指针并写入内存位置,要么只返回结果。