OpenCV 无法识别 Mat 大小

OpenCV not recognizing Mat size

我正在尝试使用定义 400x400 垫子的 OpenCV 打印图像:

plot2 = cv::Mat(400,400, CV_8U, 255);

但是当我尝试打印这些点时,发生了一些奇怪的事情。 y 坐标仅打印前 100 个值。也就是说,如果我打印点 (50,100),它不会打印在列的第 100/400 部分,而是打印在最后。不知何故,400列变成了100列。

例如,当运行这个:

for (int j = 0; j < 95; ++j){
    plot2.at<int>(20, j) = 0;
}
cv::imshow("segunda pared", plot2);

显示如下(划线部分为上面代码对应的部分):

当它应该只占据屏幕的 95/400 时,达到 95 的线几乎占据了所有 400 点。

我做错了什么?

当你定义你的 cv::Mat 时,你清楚地告诉它来自类型 CV_8U:

plot2 = cv::Mat(400,400, CV_8U, 255);

但是当你试图打印它时,你告诉它它的类型是 int 这通常是一个有符号的 32 位而不是无符号的 8 位。所以解决方案是:

for (int j = 0; j < 95; ++j){
    plot2.at<uchar>(20, j) = 0;
}

重要说明: 请注意,OpenCV 使用标准 C++ 类型而不是固定类型。因此,无需使用 uint16_t 或类似的固定大小类型。因为在另一个平台上编译 OpenCV 和你的代码时,它们都会一起改变。


顺便说一句,迭代 cv::Mat 的一种好方法是:

for (size_t row = 0; j < my_mat.rows; ++row){
    auto row_ptr=my_mat.ptr<uchar>(row);
    for(size_t col=0;col<my_mat.cols;++col){
         //do whatever you want with  row_ptr[col]  (read/write)
    }
}