Как получить несколько значений, распакованных в векторах C ++ - PullRequest
0 голосов
/ 14 января 2020

У меня есть эта функция, которая возвращает мне цвета в формате RGB отсюда

std::vector<cv::Vec3b> colors = find_dominant_colors(matImage, count);

, но теперь наряду с этим я также хочу, чтобы изображение, которое генерирует функция find_dominant_colors, возвращало, чтобы я мог использовать Это. Он генерирует три изображения, которые я пишу, используя cv::imwrite, но я хочу, чтобы эти три изображения были возвращены при вызове функции, чтобы я мог в дальнейшем просматривать его непосредственно при его возврате, а не извлекать каталог для него.

Как мне распаковать несколько значений в этой строке кода, как получить изображение, а также цвет вместо просто цвета. Должен ли я использовать несколько векторов? Как я могу это сделать ? Используемый здесь вектор является вектором opencv для получения значений RGB из изображения.

РЕДАКТИРОВАТЬ:

    std::vector<cv::Vec3b> find_dominant_colors(cv::Mat img, int count) {
    const int width = img.cols;
    const int height = img.rows;
    std::vector<cv::Vec3b> colors = get_dominant_colors(root);

    cv::Mat quantized = get_quantized_image(classes, root);
    cv::Mat viewable = get_viewable_image(classes);
    cv::Mat dom = get_dominant_palette(colors);

    cv::imwrite("./classification.png", viewable);
    cv::imwrite("./quantized.png", quantized);
    cv::imwrite("./palette.png", dom);

    return colors;
}


Выше функция возвращает здесь цвета

std::vector<cv::Vec3b> colors = find_dominant_colors(matImage, count);

Я также хочешь вернуть viewable quantized dom, как мне это сделать?

Ответы [ 2 ]

5 голосов
/ 14 января 2020

Используйте std::tuple.

Определите вашу функцию find_dominant_colors, чтобы вернуть std::tuple<cv::Mat, cv::Mat, cv::Mat, cv::Vec3b>, и сделайте это в операторе return:

return std::make_tuple(quantized, viewable, dom, colors);

В C ++ 17 вы можете использовать структурированные привязки для удобной обработки возвращаемых значений:

auto [quantized, viewable, dom, colors] = find_dominant_colors(matImage, count);

Если у вас нет C ++ 17, используйте std::tie для обработки возвращенного std::tuple:

cv::Mat quantized;
cv::Mat viewable;
cv::Mat dom;
cv::Vec3b colors;

std::tie(quantized, viewable, dom, colors) = find_dominant_colors(matImage, count);

Или вы можете позволить вычету типа работать для вас, и используйте std::get для доступа к членам возвращенных std::tuple:

auto values = find_dominant_colors(matImage, count);
auto quantized = std::get<0>(values);
auto viewable = std::get<1>(values);
auto dom = std::get<2>(values);
auto colors = std::get<3>(values);
1 голос
/ 14 января 2020

Если у вас есть функция

std::vector<cv::Vec3b> colors = find_dominant_colors(matImage, count);

и теперь вы хотите изменить функцию, чтобы она возвращала «больше», тогда вы можете объявить структуру данных

struct find_dominant_colors_result {
    std::vector<cv::Vec3b> colors;
    cv::Mat quantized;
    cv::Mat viewable;
    cv::Mat dom;
};

Теперь вызов будет выглядеть так:

find_dominant_colors_result x = find_dominant_colors(matImage, count);

или, скорее,

auto x = find_dominant_colors(matImage, count);

, в то время как вам придется изменить функцию на

find_dominant_colors_result find_dominant_colors(cv::Mat img, int count) {
    find_dominant_color_result result;
    const int width = img.cols;
    const int height = img.rows;
    result.colors = get_dominant_colors(root);

    result.quantized = get_quantized_image(classes, root);
    result.viewable = get_viewable_image(classes);
    result.dom = get_dominant_palette(result.colors);

    cv::imwrite("./classification.png", result.viewable);
    cv::imwrite("./quantized.png", result.quantized);
    cv::imwrite("./palette.png", result.dom);

    return result;
}
...