Я написал небольшую функцию, чтобы иметь возможность «приклеивать» пиксели изображения поверх другого, но это как-то не работает: хотя «фигуры» моего «прилипания», изображение правильное, цвета нет. Слияние двух матовых объектов в OpenCV
Примерный цветок - это первое изображение, а в качестве второго изображения у меня был черный трапециевидный png. Как вы можете видеть, существует множество проблем: 1. Цвета отображаются странно. На самом деле нет цветов, только оттенков серого и некоторых странных полос в качестве наложения. 2. Значения альфа-диапазона не соблюдаются. Белая часть наложенного изображения прозрачна в png.
Вот мой код:
void mergeMats(Mat mat1, Mat mat2, int x, int y){
//unsigned char * pixelPtr = (unsigned char *)mat2.data;
//unsigned char * pixelPtr2 = (unsigned char *)mat1.data;
//int cn = mat2.channels();
//int cn2 = mat2.channels();
//Scalar_<unsigned char> bgrPixel;
for (int i = 0; i < mat2.cols; i++){
for (int j = 0; j < mat2.rows; j++){
if (x + i < mat1.cols && y + j < mat1.rows){
Vec3b &intensity = mat1.at<Vec3b>(j+y, i+x);
Vec3b intensity2 = mat2.at<Vec3b>(j, i);
for (int k = 0; k < mat1.channels(); k++) {
intensity.val[k] = saturate_cast<uchar>(intensity2.val[k]);
}
//pixelPtr2[(i + x)*mat1.cols*cn2 + (j + y)*cn2 + 0] = pixelPtr[(i + x)*mat2.cols*cn + (j + y)*cn + 0];
//pixelPtr2[(i + x)*mat1.cols*cn2 + (j + y)*cn2 + 1] = pixelPtr[(i + x)*mat2.cols*cn + (j + y)*cn + 1];
//pixelPtr2[(i + x)*mat1.cols*cn2 + (j + y)*cn2 + 2] = pixelPtr[(i + x)*mat2.cols*cn + (j + y)*cn + 2];
}
}
}
}
Закомментированный код был другой подход, но имел те же результаты. Итак, вот мои вопросы: 1. Как решить проблемы 2 (1. цвета ..., 2. alpha ...) 2. Как на самом деле пиксельный массив любого Mat-Object, хорошо, организован? Думаю, мне было бы легче манипулировать этими массивами, если бы я знал, что в них.
Спасибо за ответ! Сейчас это работает. Моя единственная проблема - это альфа: мое фоновое изображение предоставляется с видео, поэтому не имеет альфа-канала. Я попытался решить это, добавив 'if (intensity2.val [3] == 0) continue;' перед циклом канала, а затем цикл mat1.channel() - раз, чтобы в конечном итоге соединить пиксели переднего и заднего фона вместе с 'uchar alpha = интенсивностью2.val [3];' и 'intensity.val [k] = saturate_cast ((intensity2.val [k] * alpha) + (intensity.val [k] * (1.0 - alpha))); '- что не работает, к сожалению ... –
Fly
' uchar alpha = intensity2.val [3]; 'значение от 0 до 255. Поэтому '(1.0 - alpha)', вероятно, не работает. – mcchu
О, верно ... Странно, что он все еще не работает даже после того, как я его отредактировал ... – Fly