29

OpenCV では、CV_8U と CV_8UC1 に違いはありますか? どちらも 1 つのチャネルを持つ 8 ビットの符号なし型を参照していますか? もしそうなら、なぜ2つの名前があるのですか? そうでない場合、違いは何ですか?

4

2 に答える 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);

クレジット: http://note.sonots.com/OpenCV/MatrixOperations.html

于 2013-01-27T15:44:11.377 に答える