Ответ 1
Это прокси-класс для передачи входных массивов только для чтения в функции OpenCV. Он определяется как:
typedef const _InputArray& InputArray;
где _InputArray
- класс, который может быть построен из Mat
, Mat_<T>
, Matx<T, m, n>
, std::vector<T>
, std::vector<std::vector<T> >
или std::vector<Mat>
. Он также может быть построен из матричного выражения.
Поскольку это в основном класс уровня реализации, и его интерфейс может измениться в будущих версиях, мы не будем описывать его подробно. Тем не менее, есть несколько ключевых моментов, которые следует учитывать:
Когда вы видите в справочном руководстве или в исходном коде OpenCV функцию, которая принимает InputArray
, это означает, что вы можете фактически пройти Mat
, Matx
, vector<T>
и т.д. (см. полный список).
Дополнительные входные аргументы: если некоторые из входных массивов могут быть пустыми, пройдите cv::noArray()
(или просто cv::Mat()
, как вы, вероятно, раньше).
Класс предназначен исключительно для передачи параметров. То есть, как правило, вы не должны объявлять членов класса, локальные и глобальные переменные этого типа.
Если вы хотите создать свою собственную функцию или метод класса, который может работать с массивами нескольких типов, вы можете использовать InputArray
(или OutputArray
) для соответствующих параметров. Внутри функции вы должны использовать метод _InputArray::getMat()
для построения заголовка матрицы для массива (без копирования данных). _InputArray::kind()
может использоваться для различения Mat
от vector<>
и т.д., но обычно это не требуется.
Итак, если вам нужно, чтобы ваша функция могла принимать как cv::Mat
, так и std::vector<>
использовать InputArray
, в противном случае просто используйте cv::Mat
.
Конечно, не использовать Mat*
.