2017-10-13 72 views
0

在许多教程e.g. this one中,显示了如何用逗号分隔列表初始化一个opencv Mat。但是,当我尝试用多维Mat来做这件事时,我感到很奇怪。多维cv的逗号分隔初始值设定:: Mat

#include "opencv2/core/core.hpp" 
#include <iostream> 

int main() { 
    cv::Mat vect = (cv::Mat_<double>(2, 2, CV_8UC3) << 1,2,3,4,5,6,7,8,9,10,11,12); 
    std::cout << "vect = " << std::endl << " " << cv::format(vect,"python") << std::endl; 
    return 12345; 
} 

输出:

vect = 
[[1, 2], 
    [3, 4]] 

可以在一个明确初始化多维垫?

编辑:此外,我在其他方式初始化时遇到麻烦。

int main() { 
    int data[2][2][3] = { 
     { 
      {1,2,3}, 
      {4,5,6} 
     }, 
     { 
      {7,8,9}, 
      {10,11,12} 
     } 
    }; 
    cv::Mat vect = cv::Mat(2, 2, CV_8UC3, data); 
    std::cout << "vect = " << std::endl << " " << cv::format(vect,"python") << std::endl; 
    return 54321; 
} 

输出:

vect = 
[[[1, 0, 0], [0, 2, 0]], 
    [[0, 0, 3], [0, 0, 0]]] 

因此,在[0][0][1]在我的输入数组元素在垫[0][1][1]结束?这里发生了什么......

回答

1

对于模板Mat_没有重载功能,需要Mat_(int rows, int cols, int type),source here

cv::Mat vect = (cv::Mat_<double>(3,4) << 1,2,3,4,5,6,7,8,9,10,11,12); 
std::cout << "vect = " << std::endl << " " <<cv::format(vect,Formatter::FMT_PYTHON) << std::endl; 

输出:

vect = 
[[1, 2, 3, 4], 
[5, 6, 7, 8], 
[9, 10, 11, 12]] 

对于非模板垫你不必给多维数组数据指针参数,所述Mat::data可以是连续的一维数据的指针。 Mat构造函数将负责处理参数中提供的通道,行和列。

uchar data[] = {1,2,3,4,5,6,7,8,9,10,11,12}; 
Mat vect(2,2,CV_8UC3,data); 
std::cout << "vect = " << std::endl << " " << cv::format(vect,Formatter::FMT_PYTHON) << std::endl; 

输出:

vect = 
[[[ 1, 2, 3], [ 4, 5, 6]], 
[[ 7, 8, 9], [ 10, 11, 12]]]