我无法重塑我的cv::Mat
。
这是我的代码。
#include "opencv2/core/core.hpp"
#include "opencv2/contrib/contrib.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/objdetect/objdetect.hpp"
#include <boost/algorithm/string.hpp>
#include <stdlib.h>
#include <vector>
#include <string>
#include <assert.h>
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <iterator>
#include <sstream>
int main(int argc, const char* argv[])
{
std::cout << "Startn";
cv::Mat eigenvectors = (cv::Mat_<float>(2,2) << 4, 3, 2, 1);
std::cout << "eigenvectors shape " << eigenvectors.size() << std::endl;
cv::Mat reshaped = eigenvectors.reshape(4, 1);
std::cout << reshaped.size() << std::endl;
std::cout << reshaped << std::endl;
}
结果如下。
Start
eigenvectors shape [2 x 2]
[1 x 1]
[4, 3, 2, 1]
为什么我的程序声称有一个1x1矩阵,但保持4x1矩阵的值?它只对这个维度执行此操作。
当我扩展代码以包含这些测试时。
reshaped = eigenvectors.reshape(1, 4);
std::cout << reshaped.size() << std::endl;
std::cout << reshaped << std::endl;
reshaped = eigenvectors.reshape(2, 2);
std::cout << reshaped.size() << std::
我得到正常的结果。
[1 x 4]
[4; 3; 2; 1]
[1 x 2]
[4, 3; 2, 1]
这是一个bug还是我做错了什么?
编辑:为了提高这个结果的谷歌相关性,我遇到的另一个症状是,由于我的"重塑",我也失去了我的Mat
的类型。
确保您完全理解reshape()
的效果以及您传递给方法的参数的含义。以下是OpenCV文档中关于它的文章:
Mat Mat::reshape(int cn, int rows=0) const
因此,在您的第一个代码片段中,您通过四个元素初始化Parameters: cn – New number of channels. If the parameter is 0, the number of channels remains the same. rows – New number of rows. If the parameter is 0, the number of rows remains the same.
eigenvectors
: 4,3,2,1。reshape()
为这些元素创建另一个给定大小参数的矩阵。
cv::Mat reshaped = eigenvectors.reshape(4, 1);
-好了,你得到[1x1]
4通道矩阵。所有元素都存储在reshaped
矩阵的单个4通道元素中,就像输出所说的那样。要创建具有所需行数和列数的矩阵,请相应地设置通道数和列数。例如,如果有一个[4x4]
大小的1通道矩阵,并且您希望它有2行8列,则只需调用reshape(1,2)
。
希望能有所帮助。
大多数人的困惑是,opencv重塑()函数不同于Matlab的重塑,在Matlab中您手动提供新的nummofrows和nummofcols。使用openCV,您只需提供新的图像尺寸(通道数)作为第一个参数,然后将行数作为第二个参数。
Open CV自动为您计算新列数