2017-10-13 10 views
0

e.g. this oneのチュートリアルでは、カンマで区切ったリストでopencv 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]] 

一つが明示的に多次元マットを初期化することはできますか?

EDIT:また、他の方法で初期化するのに問題があります。

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は、連続的な1次元データポインタすることができます。 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]]]