0

EstimatorRigidTransform() への呼び出しの結果として、「trans」という名前の cv::Mat オブジェクトを取得します。含まれている行列を取得するには、次の方法でその要素にアクセスしようとします。

for (i=0; i<2; i++) for (j=0; j<3; j++)
{
   mtx[j][i]=CV_MAT_ELEM(trans,double,i,j);
}

残念ながら、VS2010 ではコンパイラ エラーが発生します。

error C2228: left of '.ptr' must have class/struct/union

CV_MAT_ELEM の行の場合。このマクロをアンラップすると、次のようなものが見つかります

(mat).data.ptr + (size_t)(mat).step*(row) + (pix_size)*(col))

(mat).data の後ろにある「.ptr」を削除すると、コンパイルされます。しかし、それが解決策であるとは想像できません (または、それがバグであるとは想像できず、それに気付いたのは私だけです)。では、ここで実際に何が間違っているのでしょうか?

ありがとう!

4

2 に答える 2

1

このようなマット要素にはアクセスしません。トラバーサルについては、サンプルコードを使用して他の回答を参照してください: カラーマトリックストラバーサル

または、グレースケールマットのopencvrefmanを参照してください。

Mat M; // should be grayscale
int cols = M.cols, rows = M.rows;
for(int i = 0; i < rows; i++) 
{
  const double* Mi = M.ptr<double>(i); 
  for(int j = 0; j < cols; j++)
  {
    Mi[j]; // is the matrix element.
  }
}
于 2012-11-02T10:33:11.697 に答える
0

私の側からの単なる補遺: 一方、CV_MAT_ELEM は構造 CvMat (OpenCV-C インターフェイス) を想定しているが、cv::Mat (C++ インターフェイス) を想定していないことがわかりました。そのため、この面白いエラーが発生します。cv::Mat から CvMat への変換は、CvMat にキャストするだけで実行できます。OpenCV の C および C++ インターフェイスとの面白い混乱...

于 2012-11-06T09:16:52.580 に答える