Является ли "InputArray" и "Mat" одинаковым в opencv?

В документации, например, есть:

void cv::absdiff    (   InputArray      src1,
        InputArray      src2,
        OutputArray     dst 
    ) 

Это то же самое, что:

void cv::absdiff    (   Mat     src1,
            Mat     src2,
            Mat     dst 
        ) 

или

void cv::absdiff    (   Mat*    src1,
            Mat*    src2,
            Mat*    dst 
        ) 

?

Мне нужно это для создания новой функции, например

void absDiffSay(XXX src1, XXX src2, XXX dst)
{
  cv::absdiff(src1,src2,dst);
  cout<<"absdiff"<<endl;
}

Ответ 1

Из Документ OpenCV

Это прокси-класс для передачи входных массивов только для чтения в функции 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*.