В чем смысл этого выражения OpenCV Matrix? - PullRequest
2 голосов
/ 21 мая 2019

Мне нужна помощь, чтобы лучше понять этот фрагмент кода о смешивании альфа-каналов.Существует 2 типа данных Mat, и оба они разделены, чтобы получить альфа-канал ([3] - альфа-канал RGBA).Затем есть еще 1 переменная Mat с именем multiplier, которую я не совсем понимаю, как и как работает операция с этой переменной.

split(mat1, mat1_split);
split(mat2, mat2_split);
Mat multiplier = (mat1_split[3] & mat2_split[3])/255 + 1;  //Need explanation here

Если я расширю определение & между mat1_split[3] и mat2_split[3] в Visual Studio будет отображаться это определение CV_EXPORTS MatExpr operator & (const Mat& a, const Mat& b);.

Это, вероятно, похоже на вопрос новичка, но я не мог понять значение операции multiplier выше.

Ответы [ 2 ]

3 голосов
/ 21 мая 2019

Давайте посмотрим на следующий пример:

cv::Mat mat1 = cv::Mat(150, 150, CV_8UC4, cv::Scalar(255, 0, 0, 255));
cv::rectangle(mat1, cv::Point(0, 0), cv::Point(49, 150), cv::Scalar(255, 0, 0, 64), cv::FILLED);
cv::rectangle(mat1, cv::Point(50, 0), cv::Point(99, 150), cv::Scalar(255, 0, 0, 128), cv::FILLED);

cv::Mat mat2 = cv::Mat(150, 150, CV_8UC4, cv::Scalar(0, 0, 255, 255));
cv::rectangle(mat2, cv::Point(0, 0), cv::Point(150, 49), cv::Scalar(0, 0, 255, 64), cv::FILLED);
cv::rectangle(mat2, cv::Point(0, 50), cv::Point(150, 99), cv::Scalar(0, 0, 255, 128), cv::FILLED);

std::vector<cv::Mat> mat1_split;
std::vector<cv::Mat> mat2_split;

cv::split(mat1, mat1_split);
cv::split(mat2, mat2_split);
cv::Mat inter = mat1_split[3] & mat2_split[3];
cv::Mat multiplier = (mat1_split[3] & mat2_split[3]) / 255 + 1;

cv::imwrite("images/mat1.png", mat1);
cv::imwrite("images/mat2.png", mat2);
cv::imwrite("images/inter.png", inter);
cv::imwrite("images/multiplier.png", multiplier);

У нас есть mat1, как это:

mat1

И у нас есть mat2 вот так:

mat2

Частичные прозрачные пленки для mat1 и mat2: 64 и 128, см. Код выше.

Промежуточный результат (inter) двоичного оператора И & выглядит следующим образом:

inter

Поскольку это двоичное И, вы получите 0 за комбинацию 64 и 128 (первая строка, второй столбец, а также вторая строка, первый столбец), но, например, вы ' получим 64 за комбинацию 64 и 64 (первый ряд, первый столбец). С другой стороны, вы также получите 64 для комбинации 64 и 255 (первый ряд, третий столбец, а также третий ряд, первый столбец).

Итак, это "синтаксическая" часть, но "семантическая" за этим стоит? Я думаю, вам нужно спросить автора этого фрагмента кода. Я не получаю смысла отменять альфа-каналы, если они не совпадают (64 и 128), но сохраняет их, если они совпадают (64 и 64). (Особенно, если учесть, что объединение 64 и 127 также даст 64 ...)

multiplier равно 1 для всех пикселей, где объединенное значение меньше или равно 127, а 2 в противном случае. Опять же, по поводу "семантической" части спросите у автора.

Надеюсь, это поможет - хотя бы немного.

1 голос
/ 22 мая 2019

Вы запрашиваете бит / пиксель мудрой операции

& -> И операция принимает наибольшее значение из всех входов 0 0> 0 0 1> 1 1 0> 1 1 1> 1

Есть много других, таких как

| -> или операция

для других оперантов, таких как XOR, NOT, NAND, NOR и XNOR, я не уверен, что opencv позволяет или нет, вы можете попробовать

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