OpenCV无法识别Mat尺寸

use*_*350 4 c++ opencv image-processing mat

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

plot2 = cv::Mat(400,400, CV_8U, 255);
Run Code Online (Sandbox Code Playgroud)

但是当我尝试打印点时,会发生一些奇怪的事情.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);
Run Code Online (Sandbox Code Playgroud)

显示这个(带下划线的部分是与上面代码对应的部分):

图片

当它应该仅占据屏幕的95/400时,到95的线几乎占据所有400点.

我究竟做错了什么?

Hum*_*awi 6

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

plot2 = cv::Mat(400,400, CV_8U, 255);
Run Code Online (Sandbox Code Playgroud)

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

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

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


BTW,迭代你的好方法之一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)
    }
}
Run Code Online (Sandbox Code Playgroud)