Как узнать тип объекта Mat с помощью Mat :: type () в OpenCV

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

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

и type = 16. Как мне определить тип матрицы матов?

Я пытался найти ответ в ее руководстве или в нескольких книгах напрасно.

90 голосов | спросил Tae-Sung Shin 16 AMpMon, 16 Apr 2012 04:51:21 +040051Monday 2012, 04:51:21

4 ответа


0

В заголовке OpenCV " types_c.h " есть набор определений, которые генерируют их, формат: CV_bits{U|S|F}C<number_of_channels>

Изменить. См. " 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), поэтому он не говорит вам что-нибудь об оригинальном файле.

ответил Martin Beckett 16 AMpMon, 16 Apr 2012 07:50:43 +040050Monday 2012, 07:50:43
0

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

ответил Angie Quijano 27 AMpWed, 27 Apr 2016 02:46:52 +030046Wednesday 2016, 02:46:52
0

Я добавил удобство использования функции из ответа @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<uchar>(y,x)"; break;  
        case CV_8S:  r = "8S";   a = "Mat.at<schar>(y,x)"; break;  
        case CV_16U: r = "16U";  a = "Mat.at<ushort>(y,x)"; break; 
        case CV_16S: r = "16S";  a = "Mat.at<short>(y,x)"; break; 
        case CV_32S: r = "32S";  a = "Mat.at<int>(y,x)"; break; 
        case CV_32F: r = "32F";  a = "Mat.at<float>(y,x)"; break; 
        case CV_64F: r = "64F";  a = "Mat.at<double>(y,x)"; break; 
        default:     r = "User"; a = "Mat.at<UKNOWN>(y,x)"; break; 
    }   
    r += "C";
    r += (chans+'0');
    cout << "Mat is of type " << r << " and should be accessed with " << a << endl;

}
ответил shahar_m 4 PMpTue, 04 Apr 2017 22:07:24 +030007Tuesday 2017, 22:07:24
0

На это ответили еще несколько человек, но я нашел решение, которое мне действительно помогло.

System.out.println(CvType.typeToString(yourMat));
ответил ProgrammingCuber 15 PM000000100000000931 2017, 22:21:09

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132