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

38
在OpenCV中,CV_8U和CV_8UC1有什么区别?它们都是指一个具有一个通道的8位无符号类型吗?如果是,为什么会有两个名称?如果不是,它们之间有什么区别?
2个回答

18
您可以从答案中看出,它们评估为相同的类型。
至于为什么有两个名称,如果您查看#define的结构(请参见链接的答案),则OpenCV中的类型由两部分组成:深度和通道数。该系统足够灵活,可以让您定义具有多达512个通道的新类型。恰好当您指定1个通道时,类型的通道组件设置为0,这使得结果等效于仅使用深度CV_8U。

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


这篇文章介绍了一些基本的矩阵操作,包括创建、复制、转置、重新调整大小、填充和清除等。此外,还讨论了如何使用运算符进行基本的数学运算,例如加法、减法、乘法和除法。最后,该文章提供了一些示例代码,以帮助读者更好地理解这些概念。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接