在 OpenCV 中,CV_8U 和 CV_8UC1 有区别吗?它们是否都指的是具有一个通道的 8 位无符号类型?如果是这样,为什么有两个名字?如果不是,有什么区别?
问问题
82073 次
2 回答
13
您可以从这个答案中看到,它们评估为相同的类型。
至于为什么有两个名称,如果您查看#defines 的结构(再次参见链接答案),OpenCV 中的类型有两个部分,深度和通道数。该系统足够灵活,可以让您定义多达 512 个通道的新类型。碰巧的是,当您指定 1 个通道时,类型的通道分量设置为 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 回答