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

C++ C++;/OpenCV-如何重塑cv::Mat?,c++,opencv,C++,Opencv,我有一个cv::Mat,它的尺寸是40行X 32列 但是,我需要重新塑造这个cv::Mat,这样它将有100行X 32列,并将空元素替换为0 我已尝试使用以下代码: cv::Mat mat1 = <from somewhere else> mat1.reshape(mat1.cols, 100); 有没有人有过重塑cv::Mat矩阵的经验?同样,我真的希望能够获取100行X 32列矩阵,然后返回40行X 32列矩阵(只需截断多余的行);但是我假设如果我解决了一个问题,那么我就会解决

我有一个
cv::Mat
,它的尺寸是
40行X 32列

但是,我需要重新塑造这个
cv::Mat
,这样它将有
100行X 32列
,并将空元素替换为
0

我已尝试使用以下代码:

cv::Mat mat1 = <from somewhere else>
mat1.reshape(mat1.cols, 100);

有没有人有过重塑
cv::Mat
矩阵的经验?同样,我真的希望能够获取
100行X 32列
矩阵,然后返回
40行X 32列
矩阵(只需截断多余的行);但是我假设如果我解决了一个问题,那么我就会解决另一个问题。

您可以使用OpenCV中的类对
Mat
对象进行切片。范围是独占的,这意味着
范围(0,4)
将引用第1、2和3行(它不会引用第4行)

下面是一个将4x3矩阵复制到6x3矩阵的示例。您可以将其用于任意数量的行和列:

Mat onesMat = Mat::ones(4, 3, CV_8UC1);
Mat zerosMat = Mat::zeros(6, 3, CV_8UC1);

cout<<"Before copying:"<<endl;
cout<<onesMat<<endl<<zerosMat<<endl;

// Copy onesMat to zerosMat. Destination rows [0,4), columns [0,3)
onesMat.copyTo(zerosMat(Range(0,4), Range(0,3)));


cout<<"After copying:"<<endl;
cout<<onesMat<<endl<<zerosMat<<endl;

以下是一种简单的方法,可以使用:

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

Rect roi(0, 0, 32, 40);
Mat mat1 = padded(roi);


请注意,此处不适用,因为新矩阵中没有额外的元素,也没有排除任何元素。

这看起来是一个不错的方法。但是,我在
.copyTo
行上看到一个
没有匹配函数用于调用类型为“cv::Mat”的对象。错误指向填充的
。有什么想法吗?很有魅力!谢谢
Before copying:
[1, 1, 1;
  1, 1, 1;
  1, 1, 1;
  1, 1, 1]
[0, 0, 0;
  0, 0, 0;
  0, 0, 0;
  0, 0, 0;
  0, 0, 0;
  0, 0, 0]
After copying:
[1, 1, 1;
  1, 1, 1;
  1, 1, 1;
  1, 1, 1]
[1, 1, 1;
  1, 1, 1;
  1, 1, 1;
  1, 1, 1;
  0, 0, 0;
  0, 0, 0]
Mat padded = Mat(100, 32, CV_8UC1, Scalar(0));
mat1.copyTo(padded(Rect(0, 0, mat1.cols, mat1.rows)));
Rect roi(0, 0, 32, 40);
Mat mat1 = padded(roi);