2013-02-28 14 views
8

私はホモグラフィーに取り組んでいましたが、H.at<float>(i, j)を使ってH行列(CV_64F型)の値をチェックしようとすると、乱数(時にはガベージ値)が得られます。私はfloat行列のピクセル値にアクセスしたいです。それを行う方法はありますか?CV_32F/CV_64F Matのピクセル値にアクセスするには?

Mat A = Mat::eye(3, 3, CV_64F); 
float B; 
for(int i=0; i<A.rows; i++) 
{ 
    for(int j=0; j<A.cols; j++) 
    { 
     printf("%f\n", A.at<float>(i, j)); 
    } 
} 

imshow("identity", A); 
waitKey(0); 

これは、単位行列の正しい画像を示すが、画素値にアクセスしようとしたとき、私は

0.000000 1.875000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000

を得ます

なぜこれはそうですか?

答えて

16

あなたはこの試してみてください:あなたの行列は順番に、それはタイプdouble、ないfloatの要素を含むことを意味する「タイプ」CV_64Fであるため

A.at<double>(i, j); 

を。ところで

が、私はあなたがこのことを認識しているかどうかわからないんだけど、あなたはそうのような行列を印刷するcoutを使用することができます。

std::cout << A << std::endl; 

私は、これは、小さな行列を検査するために有用であることが判明しましたまたはマトリックスのスライスである。

+0

oh。クール。それはうまくいった。ありがとう。 :) – Froyo

+0

おそらく私の答えを正しいものとしてマークすることができます。ありがとう。 – lightalchemist

3

以下の例では、ヒルベルト行列を初期化:

Mat H(100, 100, CV_64F); 
for(int i = 0; i < H.rows; i++) 
    for(int j = 0; j < H.cols; j++) 
     H.at<double>(i,j)=1./(i+j+1); 

は、オペレータに使用されるサイズ識別子がランダムに選択することができないことに注意してください。これは、データを取得しようとしているイメージによって異なります。以下の表は、これに関するより良い見識を示しています。

マトリックスがCV_8Uタイプの場合、Mat.at<uchar>(y,x)を使用してください。

行列の型がCV_8Sの場合は、Mat.at<schar>(y,x)を使用します。

行列の型がCV_16Uの場合は、Mat.at<ushort>(y,x)を使用します。

行列の型がCV_16Sの場合は、Mat.at<short>(y,x)を使用します。

行列の型がCV_32Sの場合は、Mat.at<int>(y,x)を使用します。

行列の型がCV_32Fの場合は、Mat.at<float>(y,x)を使用します。

行列の型がCV_64Fの場合は、Mat.at<double>(y,x)を使用します。

OpenCV docsから)

+0

素敵な要約、thx! –

関連する問題