2011-11-16 33 views
5

Tengo dos imágenes en opencv: Imagen A y Imagen B.Cómo combinar dos imágenes sin perder intensidad en opencv

La imagen A es trama de salida de la cámara .
Imagen B es una imagen transparente alfa obtenida por enmascaramiento una imagen.
Antes de enmascaramiento Imagen B se deformó con cvWarpPerspective()

  • Probé cvAddWeighted()- Se pierde intensidad cuando das alfa y valor beta
  • Probé aishack- Incluso aquí se pierde intensidad global de la imagen de salida
  • intenté silveiraneto.net- No útil en mi caso

Por favor, ayúdenme con algo que no pierda intensidad en la imagen de salida después de la mezcla.

Gracias de antemano

Respuesta

2

Finalmente recibí la respuesta. Consiste en 5 pasos ....

Step - 1

cvGetPerspectiveTransform(q,pnt,warp_matrix); 
//where pnt is four point x and y cordinates and warp_matrix is a 3 x 3 matrix 

Step - 2

cvWarpPerspective(dst2, neg_img, warp_matrix,CV_INTER_LINEAR) 
//dst2 is overlay image ,neg_img is a blank image 

Step - 3

cvSmooth(neg_img,neg_img,CV_MEDIAN); //smoothing the image 

Step - 4

cvThreshold(neg_img, cpy_img, 0, 255, CV_THRESH_BINARY_INV); 
//cpy_img is a created image from image_n 

Paso - 5

cvAnd(cpy_img,image_n,cpy_img);// image_n is a input image 
cvOr(neg_img,cpy_img,image_n); 

salida - image_n (sin perder la intensidad de la imagen de entrada)

+0

y obtendrá superposición sin antialias. Puedes hacerlo en dos pasos: 1) obtener warp_matix, 2) warpPerspective (foto, fotograma, warp_matrix, frame.size(), INTER_LINEAR, BORDER_TRANSPARENT); –

2

Cuando dicen, que se pierde intensidad ... salir de la pregunta acerca de cómo lo pierde?

¿Te intensidad floja en el sentido de:

que, al añadir las imágenes que golpeó una intensidad máxima, y ​​el resto se desecha. (Ejemplo para una adición de 8 bits de píxeles: Pix1 = 200 i, Pix2 = 150 i. "Pix1 + Pix2 = 350" pero valor máximo en 255, entonces Pix1 + Pix2 = 255)

Que los valores anteriores de la imagen A está comprometido al agregarlo a la Imagen B, que solo cubre algunas partes de la imagen. (Ejemplo para una imagen de 8 bits: Pix1 = 200 i, Pix2 = 150, (Pix1 + Pix2)/2 = 175, pero cuando el valor de un píxel de la segunda imagen es cero, Pix2 = 0. Entonces (Pix1 + Pix2)/2 = 100, que es la mitad del valor de la imagen original)

Una de estas observaciones debería informarle sobre lo que debe hacer. No sé exactamente, de acuerdo con las funciones que mencionas, qué enfoque usan.

+0

Gracias por la respuesta 1 para eso, pero lo que necesitamos aquí es ... Supongamos que tiene una imagen de gafas (png transparente) en photoshop, ¿cómo superpone esa imagen en la cara de alguien (otra imagen) arrastrándola hacia arriba y ajustando traer al frente y atrás ... Lo mismo Quiero hacer en opencv ... Todo lo que dices es cuál es mi pregunta ... Necesito alguna forma de evitar eso ... – Wazzzy

+0

Si pudieras trabajar con un img de cuatro canales como RGB (A) para rojo verde azul y aplha, en lugar de solo 3 canales como RGB. Es posible que pueda agregarlos, cambiando cada píxel de la imagen A (la imagen de la parte posterior) hacia su nueva imagen (con transparencias) y haciendo esto en una escala de 0 a 1, según el canal alfa. Me temo que todavía no puedo dar algunos ejemplos exactos de código. – Sonaten

+0

Además. Si su transparencia está estrictamente en los valores _On y Off_, es posible que desee comprobar el valor alfa para cada píxel en la imagen transparente y luego simplemente escriba ese valor en la imagen de fondo si el valor alfa es "verdadero" – Sonaten