c++ - Mat 单元格在 OpenCV 中设置为 NULL?

标签 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。所以没有多边形 => 所有 map 都应该是“合法的”。

我已经定义了这个方法来检查是否允许给定的 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。 如果我打印整个 Mat,我只会看到 0 在我的屏幕上闪烁,所以它们显然在那里。

为什么 isAllowed(bool, x, y) 对 (0,0) 返回 false,而那里显然有一个 0?

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

最佳答案

现在问题已经解决,这里是我的错误供以后引用:

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

2:在isAllowedPosition(bool res, int x, int y)中,res有一个原始类型。也就是将其压入堆栈而不是对内存位置的引用。写入时,我写入本地拷贝,而不是作为参数传入的拷贝。

两个可能的修复方法,要么传入一个指向内存位置的指针并写入该位置,要么简单地返回结果。

关于c++ - Mat 单元格在 OpenCV 中设置为 NULL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42599434/

相关文章:

c++ - 强制属性类型为 doxygen

数据库,使用 null 作为三元选项的不良做法?

c# - 在 C# 中创建的数字签名在 C++ 中不验证

python - 使用 OpenCV 清理文本图像以进行 OCR 阅读

访问 cv2.VideoCapture(0) 的 Python 意外退出

OpenCV - 训练新的 LatentSVMDetector 模型

MySQL 从 Null 变为 Non Null

Java获取不为null的对象

c++ - 我可以为包含 vector 的 C++ 结构进行单个二进制写入吗

python - 具有与 Python 的过滤器和映射相同功能的 C++ 工具