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*
、追加のキャストを必要とする代わりに?