OpenCV では、CV_8U と CV_8UC1 に違いはありますか? どちらも 1 つのチャネルを持つ 8 ビットの符号なし型を参照していますか? もしそうなら、なぜ2つの名前があるのですか? そうでない場合、違いは何ですか?
質問する
82073 次
2 に答える
13
この回答からわかるように、それらは同一の型に評価されます。
2 つの名前がある理由については、#defines がどのように構造化されているかを見ると (リンクされた回答を参照してください)、OpenCV の型には深さとチャネル数の 2 つの部分があります。このシステムは、最大 512 チャネルで新しいタイプを定義できるほど柔軟です。1 チャンネルを指定すると、type のチャンネル コンポーネントが 0 に設定され、単純に深度 CV_8U を使用した場合と同じ結果になることがあります。
于 2013-01-28T16:15:00.563 に答える
4
それらは同じでなければなりません。私にとっては、使用CV_8UC1
しているチャネルの数がコードにより明確になるため、使用することを好みます。
ただし、10 チャネル以上のマトリックスを扱う場合は、チャネル数を指定する必要があります。
以下のコード スニペットを使用して、チャンネル数を試してみてください。
#define CV_MAT_ELEM_CN( mat, elemtype, row, col ) \
(*(elemtype*)((mat).data.ptr + (size_t)(mat).step*(row) + sizeof(elemtype)*(col)))
...
CvMat *M = cvCreateMat(4, 4, CV_32FC(10));
for(int ch = 0; ch < 10; ch++) {
for(int i = 0; i < 4; i++) {
for(int j = 0; j < 4; j++) {
CV_MAT_ELEM_CN(*M, float, i, j * CV_MAT_CN(M->type) + ch) = 0.0;
cout << CV_MAT_ELEM_CN(*M, float, i, j * CV_MAT_CN(M->type) + ch) << " ";
}
}
cout << endl << endl;
}
cvReleaseMat(&M);
于 2013-01-27T15:44:11.377 に答える