重塑OpenCV Mat失败



我无法重塑我的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自动为您计算新列数

相关内容

  • 没有找到相关文章

最新更新