В OpenCV существует ли разница между CV_8U и CV_8UC1? Оба они относятся к 8-разрядному беззнаковому типу с одним каналом? Если да, то почему есть два имени? Если нет, то какая разница?
В OpenCV, какая разница между CV_8U и CV_8UC1?
Ответ 1
Вы можете видеть из этого ответа, они оценивают одинаковые типы.
Что касается того, почему существуют два имени, если вы посмотрите, как структурируются #defines (опять же, см. связанный ответ), тип OpenCV имеет 2 части, глубину и количество каналов. Система достаточно гибкая, чтобы вы могли определять новые типы с 512 каналами. Так получилось, что когда вы указываете 1 канал, компонент канала типа устанавливается в 0, что делает результат эквивалентным простому использованию глубины CV_8U.
Ответ 2
Они должны быть одинаковыми. Для меня я предпочитаю использовать 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);