重塑OpenCV Mat失败

时间:2014-03-30 12:25:10

标签: c++ opencv matrix

我无法重塑我的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的类型。

2 个答案:

答案 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会自动为您计算新列的数量。