C++/OpenCV - 如何重塑 cv::Mat?

Bre*_*ett 5 c++ opencv

我有一个cv::Mat尺寸为40 rows X 32 columns.

但是,我需要重塑它,cv::Mat以便它具有100 rows X 32 columns,愿意带有0.

我试过使用代码:

cv::Mat mat1 = <from somewhere else>
mat1.reshape(mat1.cols, 100);
Run Code Online (Sandbox Code Playgroud)

但它因错误而失败:

OpenCV Error: Bad argument (The total number of matrix elements is not divisible by the new number of rows) in reshape.
Run Code Online (Sandbox Code Playgroud)

有没有人有重塑cv::Mat矩阵的经验?同样,我真的希望能够获取一个100 rows X 32 columns矩阵并返回到一个40 rows X 32 columns矩阵(并截断额外的行);但我假设如果我解决了一个问题,那么我就会解决另一个问题。

her*_*tao 4

这是通过使用以下方法来完成此操作的简单方法Mat::copyTo()

Mat padded = Mat(100, 32, CV_8UC1, Scalar(0));
mat1.copyTo(padded(Rect(0, 0, mat1.cols, mat1.rows)));
Run Code Online (Sandbox Code Playgroud)

另一方面,如果你想40x32从 中返回100x32 Mat,也很容易做到:

Rect roi(0, 0, 32, 40);
Mat mat1 = padded(roi);
Run Code Online (Sandbox Code Playgroud)

请注意,Mat::reshape()此处不合适,因为新矩阵中不包含任何额外元素,也不排除任何元素。