Подтвердить что ты не робот

В OpenCV, какая разница между CV_8U и CV_8UC1?

В OpenCV существует ли разница между CV_8U и CV_8UC1? Оба они относятся к 8-разрядному беззнаковому типу с одним каналом? Если да, то почему есть два имени? Если нет, то какая разница?

4b9b3361

Ответ 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);

кредит: http://note.sonots.com/OpenCV/MatrixOperations.html