【发布时间】:2020-03-31 07:28:38
【问题描述】:
我想声明一个 cv::Mat 对象并在我的代码中的其他地方更改它的维度(nrows 和 ncols)。我在 OpenCV 的文档中找不到任何方法。他们总是建议在构造函数中包含维度。
【问题讨论】:
我想声明一个 cv::Mat 对象并在我的代码中的其他地方更改它的维度(nrows 和 ncols)。我在 OpenCV 的文档中找不到任何方法。他们总是建议在构造函数中包含维度。
【问题讨论】:
一个简单而干净的方法是使用create() 方法。你可以任意调用它,当它的参数与现有缓冲区不匹配时,它会重新分配图像缓冲区:
Mat frame;
for(int i=0;i<n;i++)
{
...
// if width[i], height[i] or type[i] are != to those on the i-1
// or the frame is empty(first loop)
// it allocates new memory
frame.create(height[i], width[i], type[i]);
...
// do some processing
}
文档可在https://docs.opencv.org/3.4/d3/d63/classcv_1_1Mat.html#a55ced2c8d844d683ea9a725c60037ad0获取
【讨论】:
如果您要调整图片大小,请查看resize()!
使用您想要的维度和数据类型创建一个新的Mat dst,然后:
cv::resize(src, dst, dst.size(), 0, 0, cv::INTER_CUBIC);
除了cv::INTER_CUBIC,还有其他的插值方法,查看文档。
【讨论】:
resize()(据我所知),次数多得我数不清了。每当您需要更改 src Mat 的尺寸时,您只需声明一个具有所需尺寸和类型的新 Mat,然后执行 resize() 以便将数据缩放到新尺寸。如果您愿意,您仍然可以执行src = dst.clone(); 将重新标注的数据复制到原始 Mat。
您是否只想使用您这样计算的Size 变量来定义它?
// dynamically compute size...
Size dynSize(0, 0);
dynSize.width = magicWidth();
dynSize.height = magicHeight();
int dynType = CV_8UC1;
// determine the type you want...
Mat dynMat(dynSize, dynType);
【讨论】:
create() 绝对应该在你声明了Mat 对象之后与构造函数做同样的事情。
如果您知道最大尺寸并且只需要使用总 Mat 中的行/列的子范围,请使用函数 cv::Mat::rowRange 和/或 cv::Mat::colRange
http://docs.opencv.org/modules/core/doc/basic_structures.html#mat-rowrange
【讨论】: