OpenCV无法识别Mat尺寸

时间:2016-05-27 11:51:24

标签: c++ opencv image-processing mat

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

显示此信息(带下划线的部分是与上述代码对应的部分):

IMAGE

当它应该只占据屏幕的95/400时,到95的一条线几乎占据了所有400点。

我做错了什么?

1 个答案:

答案 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)
    }
}