9

簡単に言えば、Mat メンバー「uchar* data」を介して CV_32F Mat のピクセル値に直接アクセスできるかどうかを知りたいです。

Mat が CV_8U の場合、問題なく実行できます。たとえば、次のようになります。

// a matrix 5 columns and 6 rows, values in [0,255], all elements initialised at 12
cv:Mat A;
A.create(5,6, CV_8UC1);
A = cv::Scalar(12);

//here I successfully access to pixel [4,5]
uchar *p = A.data;
int value = (uchar) p[4*A.step + 5];

問題は、次のマトリックスで同じ操作を実行しようとしたときです。

// a matrix 5 columns, 6 rows, values in [0.0, 1.0], all elements initialised at 1.2
cv::Mat B;
B.create(5,6, CV_32FC1);
B = cv::Scalar(1.2);

//this clearly does not work, no syntax error but erroneous value reported!
uchar *p = B.data;  
float value = (float) p[4*B.step + 5];

//this works, but it is not what I want to do!
float value = B.at<float>(4,5);

どうもありがとう、ヴァレリオ

4

2 に答える 2

5

CV_32F は、要素がfloatの代わりにあることを意味することに注意してくださいuchar。ここでの「F」は「フロート」を意味します。また、CV_8U の「U」は の略ですunsigned integer。たぶんそれがあなたのコードが正しい値を与えない理由です。p を として宣言するとuchar*p[4*B.step+5]p が 5 行目に移動して が進みsizeof(uchar)*5ますが、これは間違っている傾向があります。あなたが試すことができます

float value = (float) p[4*B.step + 5*B.elemSize()]

しかし、うまくいくかどうかはわかりません。[i, j] のデータを値に渡すいくつかの方法を次に示します。

  1. value = B.at<float>(i, j)
  2. value = B.ptr<float>(i)[j]
  3. value = ((float*)B.data)[i*B.step+j]

ただし、オーバーフローしやすいため、3 番目の方法はお勧めしません。その上、6x5 マトリックスは で作成する必要があるB.create(6, 5, CV_32FC1)と思います。

于 2013-07-10T11:30:53.870 に答える