#opencv #overlay #alpha-transparency
#opencv #наложение #альфа-прозрачность
Вопрос:
У меня есть прозрачные изображения [показано ниже], и я пытаюсь наложить их с помощью aishack.в функции cvOverlayImage(), чтобы наложить его на источник камеры
cvOverlayImage()
void cvOverlayImage(IplImage* src, IplImage* overlay, CvPoint location, CvScalar S, CvScalar D)
{
int x,y,i;
for(x=0;x < overlay->width -10;x )
{
if(x location.x>=src->width) continue;
for(y=0;y < overlay->height -10;y )
{
if(y location.y>=src->height) continue;
CvScalar source = cvGet2D(src, y location.y, x location.x);
CvScalar over = cvGet2D(overlay, y, x);
CvScalar merged;
for(i=0;i<4;i )
merged.val[i] = (S.val[i]*source.val[i] D.val[i]*over.val[i]);
cvSet2D(src, y location.y, x location.x, merged);
}
}
}
вызов cvOverlayImage()
cvOverlayImage(image_n, neg_img, cvPoint(0, 0), cvScalar(1.0,1.0,1.0,1.0), cvScalar(0.1,0.1,0.1,0.1));
Входные данные для cvOverlayImage()
- Захват камеры
- Негативное изображение
Вывод из cvOverlayImage()
Как вы можете видеть, я не получаю того, что мне нужно.Пожалуйста, помогите мне.
Комментарии:
1. Если ваша проблема связана с прямоугольником, который портит ваше изображение, вам следует накладывать только те пиксели, которые не являются белыми (если фон белый), в противном случае вам следует создать маску изображения (возможно, пороговое значение выше фона), а затем полностью наложить эти пиксели, заменив те, что находятся под ними. Это должно дать более приятный результат 🙂
2. вы правы, но очки все равно будут казаться прозрачными 🙂
3. @Smash Я не понял, что вы прокомментировали… Вы пробовали то, что предложил Адриан Попович?.. Пожалуйста, помогите с кодом, если вы справились с этим…
4. @WasimKarani Где ты действительно можешь это решить?
5. @karlphillip Нет, я этого не делал, иначе я бы опубликовал свой ответ
Ответ №1:
Одно из решений, которое я использовал, — это просто определить, где присутствует белый цвет, и в этих случаях просто использовать пиксель из исходного изображения. В противном случае используйте пиксель наложения изображения. У меня хорошо сработало в аналогичной ситуации. Кроме того, если загружаемое изображение имеет альфа-канал и может использоваться в качестве маски, это еще лучше.
void cvOverlayImage(IplImage* src, IplImage* overlay, CvPoint location,
CvScalar S, CvScalar D)
{
int x,y,i;
for(x=0;x < overlay->width;x )
{
if(x location.x>=src->width) continue;
for(y=0;y < overlay->height;y )
{
if(y location.y>=src->height) continue;
CvScalar source = cvGet2D(src, y location.y, x location.x);
CvScalar over = cvGet2D(overlay, y, x);
CvScalar merged;
if(over.val[0] == 255 amp;amp; over.val[1] == 255 amp;amp; over.val[2] == 255 amp;amp; over.val[3] == 255)
{
// White pixel so don't overlay
for(i=0;i<4;i )
merged.val[i] = (source.val[i]);
}
else
{
for(i=0;i<4;i )
merged.val[i] = (over.val[i]);
}
cvSet2D(src, y location.y, x location.x, merged);
}
}
}
Комментарии:
1. 1… хорошая мысль… Но если бы у меня был какой-нибудь код для этого, это было бы более круто….
Ответ №2:
Это не проверено, но разве S [i] D [i] = 1 не должно сохранять общую интенсивность?
Ответ №3:
Я думаю, что то, чего вы хотите достичь, — это не сложение, а умножение:
int multiplicator = over.val[i] / 255 // 0 for black, 1 for white
merged.val[i] = source.val[i] * multiplicator;
Таким образом, значение пикселя будет исходным значением для белого пикселя наложения и черным для черного пикселя наложения.