C ++ эквивалент доступа к массиву Python со сравнением (array [условие] = значение) - PullRequest
0 голосов
/ 20 января 2020

Я следую этому учебному пособию по OpenCV Watershed, но портирую его на C ++: https://docs.opencv.org/master/d3/db4/tutorial_py_watershed.html

Проще говоря, в некоторых местах учебника автор получит доступ и назначит пиксели в матрица, использующая операцию, подобную этой:

markers[unknown==255] = 0

или эта

img[markers == -1] = [255,0,0]

То, что я хочу сделать, является эквивалентом указанной операции, но в C ++. Это кажется простым, но я просто не могу понять, как это сделать элегантно.

В первом случае я мог бы обойти это, используя cv::findNonZero, но для во-вторых, это немного усложняется, и я бы хотел избежать хакерских решений.

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

1 Ответ

1 голос
/ 21 января 2020

Вы можете использовать метод OpenCV inRange с нижней = верхней границей, чтобы получить маску, представляющую желаемые пиксели, которые нужно изменить, а затем использовать эту маску в OpenCV setTo Метод:

// Read image
cv::Mat img = cv::imread("image.png");

// Mask everything, that's pure blue (#0000FF)
cv::Mat mask;
cv::inRange(img, cv::Scalar(255, 0, 0), cv::Scalar(255, 0, 0), mask);

// Write mask
cv::imwrite("mask.png", mask);

// Update value in mask to red
img.setTo(cv::Scalar(0, 0, 255), mask);
cv::imwrite("image_new.png", img);

return 0;

Это входное изображение:

Input

Это полученная маска:

Mask

И это обновленное изображение:

New image

Надеюсь, что помогает!

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