我无法重塑我的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 << "Start\n";
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]
这是一个错误还是我做错了什么?
编辑:
为了提高Google对此结果的相关性,我遇到的另一个症状是,由于我的重塑&#34;,我也失去了Mat
的类型。
答案 0 :(得分:6)
确保您完全理解reshape()
的效果以及传递给方法的参数的含义。这是来自OpenCV文档的the article:
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通道matix,并且您希望它有2行8列,则只需拨打reshape(1,2)
。
希望它有所帮助。
答案 1 :(得分:0)
对于大多数人而言,opencv reshape()函数与Matlab的重塑不同,在matlab中你手动提供新的numOfRows和numOfCols。使用openCV,您只需提供新的图像尺寸(通道数)作为第一个参数,然后将行数作为第二个参数。
Open CV会自动为您计算新列的数量。