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