Ответ 1
Если у вас есть 8-битная маска, вы должны сделать mask = 255 - mask
. cv:: Матричный оператор вычитания перегружен, чтобы выполнять скалярное вычитание по элементам.
Есть ли простой способ инвертировать маску с помощью OpenCV? Например, если у меня есть такая маска:
010
111
010
Я хотел бы инвертировать его и получить следующее:
101
000
101
Примечание. Я использую привязки OpenCV Python, поэтому, когда можно было бы просто перебрать каждый элемент в маске, скорость выполнения может стать проблемой.
Если у вас есть 8-битная маска, вы должны сделать mask = 255 - mask
. cv:: Матричный оператор вычитания перегружен, чтобы выполнять скалярное вычитание по элементам.
cv2.bitwise_not(mask)
поможет здесь
Для 8-битной маски, использующей 255 как "on" значение:
mask = cv::Mat::ones(mask.size(), mask.type()) * 255 - mask;
Я использую этот вариант вместо решения Matt M, поскольку я по-прежнему использую OpenCV 2.1.0 для одного из моих проектов.
Я думаю, что что-то вроде этого может обрабатывать случай, когда маска ввода может иметь различные ненулевые значения:
cv::Mat1b inputMask = ....;
cv::Mat1b invertedMask(inputMask.rows, inputMask.cols);
std::transform(
inputMask.begin(), inputMask.end(), invertedMask.begin(),
std::logical_not<uint8_t>()
);