我尝试使用定义400x400 Mat的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点。
我做错了什么?
答案 0 :(得分:6)
当您定义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&amp;你的代码在另一个平台上,它们都将一起改变。
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)
}
}