我正在尝试使用定义 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)
}
}
关于c++ - OpenCV 无法识别 Mat 大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37482816/