Как проверить, является ли данный параметр cv :: noArray ()? - PullRequest
0 голосов
/ 13 февраля 2020

Я хочу реализовать функцию, которая принимает изображение в качестве необязательного параметра. Если изображение передается, я хочу использовать его, иначе я хочу рассчитать значение по умолчанию. В библиотеке OpenCV cv::noArray() используется для этой цели. Примерно так:

void doStuff(cv::InputArray candidatesMap = cv::noArray())
{
    // initialize candidatesMap if not given
    if(candidatesMap is cv::noArray())  // <-- Need help here
    {
        candidatesMap = createCandidatesMap();
    }

    // ... more code using candidatesMap
}

Как программно проверить, задан ли необязательный параметр или по умолчанию cv::noArray().

Поскольку я не нашел никакой документации, это может быть полезно и для других.

Ответы [ 3 ]

1 голос
/ 14 февраля 2020

Вы можете сделать следующее, чтобы проверить, был ли cv::InputArray присвоен cv::noArray():

void doStuff(cv::InputOutputArray candidatesMap = cv::noArray())
{
    // initialize candidatesMap if not given
    if(candidatesMap.empty())
    {
        candidatesMap = createCandidatesMap();
    }

    // ... more code using candidatesMap
}
0 голосов
/ 13 февраля 2020

Я проверил использование cv::noArray() в коде OpenCV и есть что-то вроде этого:

if (&argument == &noArray())
    return "InputArrayOfArrays: noArray()";

в вашем случае это будет, вероятно,:

void doStuff(cv::InputArray candidatesMap = cv::noArray())
{
    // initialize candidatesMap if not given
    if(&candidatesMap == &cv::noArray())
    {
        candidatesMap = createCandidatesMap();
    }
    // ... more code using candidatesMap
}

Но даже если candidatesMap не равно noArray, это не значит, что этот вход не пустой. Так что стоит также проверить его размер.

@ MichałWalenciak Сказал, что это сравнение не сработает. Так что вы можете проверить это другими способами. Чтобы проверить, действительно ли candidatesMap, вы можете позвонить candidatesMap.getObj() и проверить, действителен ли этот указатель.

0 голосов
/ 13 февраля 2020

Я знаю, что это не отвечает на ваш вопрос, но вы можете решить свою проблему, написав более чистый код. Просто напишите две функции. Один с параметром и один без.

...