c++ - OpenCV 无法识别 Mat 大小

标签 c++ opencv image-processing mat

我正在尝试使用定义 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);

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

IMAGE

一条达到 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)
    }
}

关于c++ - OpenCV 无法识别 Mat 大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37482816/

相关文章:

多次调用 C++ 析构函数

c++ - Boost mpl list 和 auto_test_case_template 编译错误

python - 警告 : QT_DEVICE_PIXEL_RATIO is deprecated

python - 使用python中的套接字编程将视频流从服务器发送到客户端

c++ - 是否存在用于Content Aware Image转换的C/C++开源库?

c++ - 最大出现次数

c++ - 查找数组中的哪两个值最大化给定表达式?

python - ImportError:libgthread-2.0.so.0:无法打开共享对象文件:使用Docker容器导入cv2时没有此类文件或目录

c++ - 使用 OpenCV 检测图像转换

python - 如何使用opencv丢弃图像的边缘?