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点.
我究竟做错了什么?
当你定义你的时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)
| 归档时间: |
|
| 查看次数: |
331 次 |
| 最近记录: |