Как узнать, какой тип объекта Mat связан с Mat :: type () в OpenCV
Я немного путаюсь с методом type()
объекта Mat
в OpenCV.
Если у меня есть следующие строки:
mat = imread("C:\someimage.jpg"); type = mat.type();
и type = 16
. Как узнать, какой тип матрицы мата ?.
Я пытался найти ответ в своем руководстве или в нескольких книгах напрасно.
- Различия в использовании функций «const cv :: Mat &», «cv :: Mat &», «cv :: Mat» или «const cv :: Mat» как параметры функции?
- Постановка компьютерной камеры с матрицей гомографии на основе 4 компланарных точек
- Как перевести эту обработку изображений из Matlab в OpenCV?
- неразрешенная ошибка внешнего символа при импорте библиотек для OpenCV2.3 в Visual Studios 2010 Express C ++
- OpenCV / SURF Как создать hash-файл / отпечаток / подпись изображения из дескрипторов?
- Как захватить рабочий стол в OpenCV (т. Е. Превратить bitmap в Mat)?
- Как правильно использовать cv :: triangulatePoints ()
- Как запустить OpenCV-код без OpenCv Manager
- Получите 3D-координаты из пикселя 2D-изображения, если известны внешние и внутренние параметры
- Рег. Добавление OpenCV в собственный C-код через CMake на Android Studio
- Фильтр карты перемещения в OpenCV
- SVM-classификатор на основе функций HOG для «обнаружения объекта» в OpenCV
- Как обнаружить простые геометрические фигуры с помощью OpenCV
Вот удобная функция, которую вы можете использовать, чтобы помочь идентифицировать ваши 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));