Как узнать, какой тип объекта Mat связан с Mat :: type () в OpenCV

Я немного путаюсь с методом type() объекта Mat в OpenCV.
Если у меня есть следующие строки:

 mat = imread("C:\someimage.jpg"); type = mat.type(); 

и type = 16 . Как узнать, какой тип матрицы мата ?.
Я пытался найти ответ в своем руководстве или в нескольких книгах напрасно.

Вот удобная функция, которую вы можете использовать, чтобы помочь идентифицировать ваши opencv-матрицы во время выполнения. Я считаю это полезным для отладки, по крайней мере.

 string type2str(int type) { string r; uchar depth = type & CV_MAT_DEPTH_MASK; uchar chans = 1 + (type >> CV_CN_SHIFT); switch ( depth ) { case CV_8U: r = "8U"; break; case CV_8S: r = "8S"; break; case CV_16U: r = "16U"; break; case CV_16S: r = "16S"; break; case CV_32S: r = "32S"; break; case CV_32F: r = "32F"; break; case CV_64F: r = "64F"; break; default: r = "User"; break; } r += "C"; r += (chans+'0'); return r; } 

Если M является var типа Mat вы можете называть его так:

 string ty = type2str( M.type() ); printf("Matrix: %s %dx%d \n", ty.c_str(), M.cols, M.rows ); 

Вывод данных, таких как:

 Matrix: 8UC3 640x480 Matrix: 64FC1 3x2 

Стоит отметить, что существуют также методы Matrix Mat::depth() и Mat::channels() . Эта функция является просто удобным способом получения понятной человеком интерпретации из комбинации этих двух значений, чьи биты хранятся в одном и том же значении.

Для целей отладки в случае, если вы хотите найти сырой тип Mat :: в отладчике:

 +--------+----+----+----+----+------+------+------+------+ | | C1 | C2 | C3 | C4 | C(5) | C(6) | C(7) | C(8) | +--------+----+----+----+----+------+------+------+------+ | CV_8U | 0 | 8 | 16 | 24 | 32 | 40 | 48 | 56 | | CV_8S | 1 | 9 | 17 | 25 | 33 | 41 | 49 | 57 | | CV_16U | 2 | 10 | 18 | 26 | 34 | 42 | 50 | 58 | | CV_16S | 3 | 11 | 19 | 27 | 35 | 43 | 51 | 59 | | CV_32S | 4 | 12 | 20 | 28 | 36 | 44 | 52 | 60 | | CV_32F | 5 | 13 | 21 | 29 | 37 | 45 | 53 | 61 | | CV_64F | 6 | 14 | 22 | 30 | 38 | 46 | 54 | 62 | +--------+----+----+----+----+------+------+------+------+ 

Например, если type = 30, то тип данных OpenCV – CV_64FC4. Если type = 50, то тип данных OpenCV равен CV_16UC (7).

В заголовке OpenCV « types_c.h » существует набор определений, которые их генерируют, формат CV_bits{U|S|F}C
Так, например, CV_8UC3 означает 8-битные символы без знака, 3 цветовых канала – каждое из этих имен отображается на произвольное целое с макросами в этом файле.

Изменить: см. « Types_c.h », например:

 #define CV_8UC3 CV_MAKETYPE(CV_8U,3) #define CV_MAKETYPE(depth,cn) (CV_MAT_DEPTH(depth) + (((cn)-1) << CV_CN_SHIFT)) eg. depth = CV_8U = 0 cn = 3 CV_CN_SHIFT = 3 CV_MAT_DEPTH(0) = 0 (((cn)-1) << CV_CN_SHIFT) = (3-1) << 3 = 2<<3 = 16 

Поэтому CV_8UC3 = 16 но вы не должны использовать этот номер, просто проверьте type() == CV_8UC3 если вам нужно знать, какой тип является внутренним массивом OpenCV.
Помните, что OpenCV преобразует jpeg в BGR (или шкалу серого, если вы передаете «0» на imread ) - поэтому он ничего не говорит о исходном файле.

Я всегда использую эту ссылку, чтобы узнать, какой тип я получаю с type() :
СПИСОК ТИПА MAT В OPENCV
Я надеюсь это тебе поможет.

Я добавил некоторую удобство использования функции из ответа @Octopus для целей отладки.

 void MatType( Mat inputMat ) { int inttype = inputMat.type(); string r, a; uchar depth = inttype & CV_MAT_DEPTH_MASK; uchar chans = 1 + (inttype >> CV_CN_SHIFT); switch ( depth ) { case CV_8U: r = "8U"; a = "Mat.at(y,x)"; break; case CV_8S: r = "8S"; a = "Mat.at(y,x)"; break; case CV_16U: r = "16U"; a = "Mat.at(y,x)"; break; case CV_16S: r = "16S"; a = "Mat.at(y,x)"; break; case CV_32S: r = "32S"; a = "Mat.at(y,x)"; break; case CV_32F: r = "32F"; a = "Mat.at(y,x)"; break; case CV_64F: r = "64F"; a = "Mat.at(y,x)"; break; default: r = "User"; a = "Mat.at(y,x)"; break; } r += "C"; r += (chans+'0'); cout << "Mat is of type " << r << " and should be accessed with " << a << endl; } 

На это ответили несколько других, но я нашел решение, которое отлично сработало для меня.

 System.out.println(CvType.typeToString(yourMat)); 
  • OpenCV 2.4.3rc и CUDA 4.2: «Ошибка OpenCV: поддержка GPU не поддерживается»
  • Обработка изображений: улучшение алгоритма для распознавания «Coca-Cola Can»
  • OpenCV groupRectangles - получение сгруппированных и негруппированных прямоугольников
  • Как уменьшить количество цветов в изображении с помощью OpenCV?
  • Совместимость шаблонов OpenCV и прозрачность
  • Как использовать opencv в студии android с помощью инструмента построения gradleиентов?
  • Как имитировать эффект линзы рыбий глаз от openCV?
  • Простое обнаружение объектов с использованием OpenCV и машинного обучения
  • В OpenCV 3.0 отсутствует несвободный модуль
  • Точка OpenCV (x, y) представляет (столбец, строка) или (строка, столбец)
  • Смешивание не удаляет швы в OpenCV
  • Давайте будем гением компьютера.