2017-05-01 4 views
0

C++やopencvでnumpy flatten()関数と同じ操作をする関数はありますか?C++の関数numpy flattenと似ています

私の質問は曖昧だったと思います。私はC++ にこの平坦化の事まで、操作のほとんどを行うことができました

center = np.uint8(center) res = center[label.flatten()]

http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_ml/py_kmeans/py_kmeans_opencv/py_kmeans_opencv.html pythonで与えられた例はここにあり、C++ OpenCVの環境でのセグメンテーションをK平均使用する

をしようとしていますラベルの次元は921600 X 1で、これもC++でも得られます。中心の寸法は4X3のマトリックスです。私は、ここでのトリックは、すべてのラベル値を中心値に固有にすることだと思います。最終的に "res"は921600 X 3になります。

私の質問はどのように私はopencvでC++でこれを行うのですか?

おかげ

+3

921600 X1マトリックスはすでにフラットアレイではありませんか? – VTT

+0

'np.flatten'は、同じデータバッファを持つ新しい配列を返しますが、新しい1dシェイプを返します。まあ、技術的には、 'ravel()'は 'view'を返し、' flatten'はコピーを返します。だから、どのように動作するかの詳細は、配列の数とその形状に依存します。 'C++'の行列/配列構造についてもっと知ることなく、私たちは同様の答えを与えることはできません。 – hpaulj

+0

@hpaulj私の質問は非常に曖昧だったと思いますが、私は今質問を更新しました –

答えて

0

は、だから私は

res = center[label.flatten()] 

はC++ OpenCVの中で次のように行うことができます(私は笑知っているがある場合)、こののない直線状または1行のソリューションが存在しない、これを考え出しました

for(int i = 0; i<labels.rows ; i++) 
{ 
    if(labels.at<int>(i) == 0) { 
    res.push_back(centers.row(0)); 
    } else if(labels.at<int>(i) == 1) { 
     res.push_back(centers.row(1)); 
    } else if(labels.at<int>(i) == 2) { 
     res.push_back(centers.row(2)); 
    } else{ 
     res.push_back(centers.row(3)); 
    } 
} 

ありがとうございます。

関連する問題