在OpenCV中,CV_8U和CV_8UC1之间有什么区别?

时间:2013-01-27 01:09:24

标签: opencv types

在OpenCV中,CV_8U和CV_8UC1之间有区别吗?它们都是指带有一个通道的8位无符号类型吗?如果是这样,为什么有两个名字?如果没有,有什么区别?

2 个答案:

答案 0 :(得分:7)

您可以从this回答中看到,他们会评估相同的类型。

至于为什么有两个名字,如果你看一下#defines的结构如何(再看看链接的答案),OpenCV中的一个类型有2个部分,深度和通道数。该系统足够灵活,可让您定义最多512个通道的新类型。只有当您指定1个通道时,类型的通道组件才会设置为0,这使得结果等效于使用深度CV_8U。

答案 1 :(得分: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