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 を使用していないことが原因である可能性があります。
なぜ
constですか?は関数の後半でインクリメントされるためptr、宣言されている理由がわかりませんconst。なぜ
.ptrですか?著者は、「行列へのポインターを計算するときは、行列の要素dataが共用体であることを覚えておいてください。したがって、このポインターを逆参照するときは、正しいポインター型を取得するために、共用体の正しい要素を示さなければなりません。 " コード行flがfloat*float* ptr = mat->data.fl + row * mat->step;
ptr型を取りuchar*、追加のキャストを必要とする代わりに?