Написание шаблонных функций, принимающих входные данные типа cv :: Mat или cv :: UMat - PullRequest
0 голосов
/ 05 сентября 2018

Какой самый простой и понятный способ написать функцию, принимающую входные аргументы типа Mat или UMat?

Должен ли я использовать InputArray, использовать шаблоны или есть лучшая альтернатива? У меня есть функции с идентичной реализацией, написанные для Mat и UMat.

Функция должна в полной мере использовать абстракцию UMat по сравнению с OpenCL и работать примерно так же быстро, как если бы она была написана только для UMats, и без необходимости копировать UMats в Mats.

Пример функции, которую я мог бы определить для Mat и UMat, следующий (пожалуйста, не предлагайте рефакторинг для удаления локальных переменных Mat / UMat, это всего лишь пример)

using namespace cv;    

void foo(const Mat & in1, const Mat & in2, Mat & out)
{
    Mat aux1;
    Mat aux2;
    exp(in1, aux1);
    exp(in2, aux2);
    add(aux1, aux2, out);
    return;
}

void foo(const UMat & in1, const UMat & in2, UMat & out)
{
    UMat aux1;
    UMat aux2;
    exp(in1, aux1);
    exp(in2, aux2);
    add(aux1, aux2, out);
    return;
}

1 Ответ

0 голосов
/ 06 сентября 2018

Предлагаемые @Miki и @Gianni, мы можем выбрать InpputArray и OutputArray для общих типов шаблонов Mat, Mat_<T>, Matx<T, m, n>, std::vector<T>, std::vector<std::vector<T> >, std::vector<Mat>, std::vector<Mat_<T> >, UMat, std::vector<UMat> or double.

void func(InputArray _src1, InputArray _src2, OutputArray _dst)
{
    Mat src1 = _src1.getMat(), src2 = _src2.getMat();
    CV_Assert( src1.type() == src2.type() && src1.size() == src2.size());
    Mat aux1 = Mat(src1.size(), src1.type());
    Mat aux2 = Mat(src1.size(), src1.type());
    cv::exp(src1, aux1);
    cv::exp(src2, aux2);

    _dst.create(src1.size(), src1.type());
    Mat dst = _dst.getMat();
    cv::add(aux1, aux2, dst);
}

Теперь вы можете проверить это с Mat или UMat или даже std::vector

int test(){
    std::vector<float> vec1 = {1,2,3};
    std::vector<float> vec2 = {3,2,1};
    std::vector<float> dst;

    func(vec1, vec2, dst);
    // now dst is [22.8038, 14.7781, 22.8038]

}
...