2016-10-24 2 views
0

マットの要素にアクセスすることはできません。OpenCVの:私はループを使用して作成されたマットオブジェクトを持っている

cluster_centre = cv::Mat(num_clusters,num_dimensions,cv::DataType<double>::type) 
// <double> is essential 

for (j = 0; j < num_clusters; j++) { 
     for (k = 0; k < num_dimensions; k++) { 
      ... 
      cluster_centre.at<double>(j,k) = ... 
      } 
} 

// rounding numbers 0...255 
cluster_centre.convertTo(cluster_centre, CV_32S); 

cout << cluster_centre << endlの出力はOKです:

[79, 99, 148; 
73, 29, 14; 
254, 254, 254; 
171, 70, 3; 
178, 189, 211] 

そしてその整形が持っているようです明らかに何も影響しない(colsrows同じまま):

cluster_centre.reshape(3,1); // storing as 1-D array of 3-channel vectors 
cout << cluster_centre.cols //output 3; 

そして、私はTR私の要素にアクセスし、さらにBGRの色をペイントするyの私が取得:

cout << Scalar(
    mycolors.at<uchar>(0,0), 
    mycolors.at<uchar>(0,1), 
    mycolors.at<uchar>(0,2))<<endl; 

[79, 0, 0, 0] // ?? 

cout << Scalar(
    mycolors.at<uchar>(0,0), 
    mycolors.at<uchar>(1,0), 
    mycolors.at<uchar>(2,0))<<endl; 

[79, 73, 254, 0] //vertical 

EDIT:行列isContinuous、確認を。

+1

これはあまり明確ではありません...しかし、2番目のスニペット[ここ](http://stackoverflow.com/a/34734939/5008845)を見てください。私にはあなたは非常に似たようなことをしようとしているようです – Miki

+0

@Miki 'cout << mycolors.at (0)<< endl;の出力は同じです:' [(最初の値)、0,0 ] ' – Slowpoke

+0

@Mikiこれは、' cluster_centre.convertTo(cluster_centre、CV_32S);; – Slowpoke

答えて

1

Mat :: reshape関数は、マットオブジェクト自体には影響しません。これは、再構成されたcv :: Matオブジェクトを返します。正しい関数呼び出しは次のようになります

cluster_centre = cluster_centre.reshape(3,1); 

すなわちヘッダのみが変更され、ソースオブジェクトのデータに戻されたオブジェクトデータポイントことに注意してください。

+0

ありがとう!はい、私は 'reshape'を呼び出す際に間違いがあったように見えるので、前の回避策から' '色ベクトルの配列で正しい解に切り替えることができます。 – Slowpoke

関連する問題