web-dev-qa-db-ja.com

CV_32F / CV_64Fマットのピクセル値にアクセスするにはどうすればよいですか?

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

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

なぜそうなのですか?

12
Froyo

これを試してみてください:

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

行列は「型」であるためCV_64Fこれは、doubleではなく、タイプfloatの要素が含まれていることを意味します。

ちなみに、これを知っているかどうかはわかりませんが、coutを使用して次のようにマトリックスを出力できます。

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

これは、小さなマトリックスまたはマトリックスのスライスを検査するのに役立つことがわかりました。

22
lightalchemist

以下の例では、ヒルベルト行列を初期化します。

_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);
_

At演算子で使用されるサイズ識別子をランダムに選択することはできないことに注意してください。これは、データを取得しようとしている画像によって異なります。以下の表は、これに関するより良い洞察を示しています。

行列のタイプが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 から取得)

13
shahar_m