OpenCV Mat преобразования данных и арифметики - PullRequest
2 голосов
/ 17 апреля 2011

Я новичок в библиотеке opencv и все еще запутался в классе C ++ Mat с версии 2.x.

Проблемы, с которыми я столкнулся:

  1. не шаблонная версия класса Mat типизирована во время выполнения, но нет функций, которые могут показать символическое имя объекта Mat, есть только cv::Mat::type(), который возвращает целое число.

  2. Если матрица имеет тип CV_8U или тип unsigned char, тогда я делаю сложную арифметику ... есть ли у нее возможность вызвать переполнение? или opencv достаточно умен, чтобы преобразовать тип данных и сделать так называемую «насыщенную арифметику»? например,

    unsigned char a = 255; unsigned char b = a+a; // == 255

    Операции a + a:

    unsigned char b = (unsigned char) clipTo_0_255((float)a + (float)a));

  3. Если я хочу избежать тонких cv::Mat::at<_Tp>, большинство решений предлагают использовать производную шаблонную версию class Mat_<_Tp>. Но _Tp должен быть примитивным типом C ++, и я не знаю соответствия между примитивным типом и системой типов CvMat ... (Может быть, это просто ...)

  4. Является ли преобразование типов данных opencv эквивалентным приведению типов в C / C ++? например,

    float a = 1.5; int b = (int) a; // == 1

    int a = 2; float b = static_cast<int>(a); // == 2.0

1 Ответ

1 голос
/ 22 апреля 2011

Для № 2 и № 4 вы должны прочитать страницу OpenCV по арифметике насыщения . В частности:

Эта семантика «насыщенности» (различная от обычного языка C «упаковка» семантика, где младшие биты принято, реализовано в каждом изображении функция обработки, от простого cv::add до cv::cvtColor, cv::resize, cv::filter2D и т. Д. Это не новый особенность OpenCV v2.x, это было там с самого начала. В новом версия этого специального шаблона оператора вводится для упрощения реализация этой семантики в ваши собственные функции.

У меня, к сожалению, нет хороших решений ваших проблем с системой типов. Поскольку все библиотечные функции OpenCV используют не шаблонный класс cv::Mat, я лично отказался от использования класса cv::Mat<T>, пока не обновится остальная часть API.

Хотя система типов довольно неловкая, ее становится гораздо проще использовать по мере привыкания к ней.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...