Как эффективно передать подвектор std :: vectorв качестве параметра (без собственной функции) - PullRequest
0 голосов
/ 03 апреля 2019

Я пытаюсь использовать функцию opencv, которая принимает std::vector<cv::Point3f> среди других параметров. В моей программе у меня есть std::vector<cv::Point3f> worldPoints и еще один std::vector<int> mask, оба размера больше, чем то, что я хочу отправить.

Я хочу передать функции opencv только записи, имеющие соответствующую ненулевую маску, настолько эффективно, насколько это возможно.

std::vector<cv::Point3f> worldPointsSubset;
for (int i=0; i<mask.size(); i++) {
    if (mask[i] != 0) {
        worldPointsSubset.push_back(worldPoints[i]);
    }
}

// Then use worldPointsSubset in function

Есть ли другой способ, возможно, не связанный с копированием данных?

РЕДАКТИРОВАТЬ 1: Я имею в виду функцию solvePnPRansac ()

Ответы [ 2 ]

1 голос
/ 03 апреля 2019

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

Чтобы определить, является ли эта копия проблемой, сначала необходимо измерить падение производительности и проверить, является ли эта копия узким местом.,Если это узкое место, первым делом нужно подсчитать количество нужных вам очков и зарезервировать эту емкость в worldPointsSubset.

0 голосов
/ 03 апреля 2019

Невозможно преобразовать данные из std::vector<int> в std::vector<cv::Point3f> без копии, потому что, несмотря на то, что вы видите одинаковые значения, размер данных может отличаться.

Но вы можете изменить тип данных, с которыми вы работаете (std::vector<int> на std::vector<cv::Point3f>) и работать напрямую с cv::Point3f и при необходимости передать их на solvePnPRansac().

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