0

Gary Bradski と Adrian Kaehler による「Learning OpenCV 」には、次のサンプル コードを含む CvMat 行列構造に関するセクションがあります (例 3-9: 単一チャネル行列のすべての要素の合計)。

float sum( const CvMat* mat ) { 

  float s = 0.0f;
  for(int row=0; row<mat->rows; row++ ) {
    const float* ptr = (const float *)(mat->data.ptr + row * mat->step);
    for(int col=0; col<mat->cols; col++ ) {
      s += *ptr++;
    }
  }
  return( s );
}

このコードについて理解できないことがいくつかありますが、OpenCV の質問ではなく、長年 C を使用していないことが原因である可能性があります。

  1. なぜconstですか?は関数の後半でインクリメントされるためptr、宣言されている理由がわかりませんconst

  2. なぜ.ptrですか?著者は、「行列へのポインターを計算するときは、行列の要素dataが共用体であることを覚えておいてください。したがって、このポインターを逆参照するときは、正しいポインター型を取得するために、共用体の正しい要素を示さなければなりません。 " コード行flfloat*

    float* ptr = mat->data.fl + row * mat->step;
    

ptr型を取りuchar*、追加のキャストを必要とする代わりに?

4

1 に答える 1