Estoy tratando de usar OpenCV 2.1 para combinar dos imágenes en una, con las dos imágenes se colocan uno al lado del otro. En Python, estoy haciendo:

import numpy as np, cv

img1 = cv.LoadImage(fn1, 0)
img2 = cv.LoadImage(fn2, 0)

h1, w1 = img1.height,img1.width
h2, w2 = img2.height,img2.width

# Create an array big enough to hold both images next to each other.
vis = np.zeros((max(h1, h2), w1+w2), np.float32)

mat1 = cv.CreateMat(img1.height,img1.width, cv.CV_32FC1)
cv.Convert( img1, mat1 )

mat2 = cv.CreateMat(img2.height, img2.width, cv.CV_32FC1)
cv.Convert( img2, mat2 )

# Copy both images into the composite image.
vis[:h1, :w1] = mat1
vis[:h2, w1:w1+w2] = mat2

h,w = vis.shape
vis2 = cv.CreateMat(h, w, cv.CV_32FC3)
vis0 = cv.fromarray(vis)
cv.CvtColor(vis0, vis2, cv.CV_GRAY2BGR)
cv.ShowImage('test', vis2)
cv.WaitKey()

Las dos imágenes de entrada son:

https://code.ros.org/trac/opencv/browser/trunk/opencv/samples/c/box.png?rev=2270

https://code.ros.org/trac/opencv/browser/trunk/opencv/samples/c/box_in_scene.png?rev=2270

La imagen resultante es:

La combinación de Dos Imágenes con OpenCV

Puede ser difícil de distinguir de la del resto de la web, pero la mayoría de la imagen es blanco, correspondiente a donde cada una de las imágenes debe ser. El área negra es donde no hay datos de la imagen que fue escrito.

¿Por qué todos mis datos de la imagen se convierten en blanco?

  • Ha visto usted find_obj.py ejemplo de OpenCV 2.3.1? Se ve exactamente como lo que usted está tratando de hacer.
  • Sí, efectivamente, eso es lo que estoy tratando de convertir a OpenCV 2.1. Yo no tengo la 2.3 y no se puede obtener a compilar, así que estoy trabajando con el 2.1 por ahora.
  • También puede crear una pregunta acerca de su problema de compilación. Creo que es solucionable. Y por favor, tenga en cuenta que flann parte de esta muestra no puede ser implementado con OpenCV 2.1 porque python bindings para flann índice se agregaron sólo en 2.3.1.
InformationsquelleAutor Cerin | 2011-09-28

3 Comentarios

  1. 94

    Para los casos en los que las imágenes pasan a ser del mismo tamaño (que es un caso común para mostrar la imagen de procesamiento de resultados), puede utilizar numpy del concatenar para simplificar el código.

    Apilar verticalmente (img1 más de img2):

    vis = np.concatenate((img1, img2), axis=0)

    De la pila horizontal (img1 a la izquierda de img2):

    vis = np.concatenate((img1, img2), axis=1)

    Para verificar:

    import cv2
    import numpy as np
    img = cv2.imread('img.png')
    vis = np.concatenate((img1, img2), axis=1)
    cv2.imwrite('out.png', vis)
    • El código es el mismo para ambos vertical y horizontal?
    • He arreglado el copiar-pegar de error. Horizontalmente a lo largo del eje 1. Usted puede probar esto por sí mismo. He añadido el código de verificación de la respuesta.
    • Este no es siempre el caso ValueError: all the input array dimensions except for the concatenation axis must match exactly
  2. 18

    Para aquellos que están buscando para combinar 2 imágenes en color en uno,
    esto es una pequeña mod Andrey la respuesta que ha trabajado para mí :

    img1 = cv2.imread(imageFile1)
    img2 = cv2.imread(imageFile2)
    
    h1, w1 = img1.shape[:2]
    h2, w2 = img2.shape[:2]
    
    #create empty matrix
    vis = np.zeros((max(h1, h2), w1+w2,3), np.uint8)
    
    #combine 2 images
    vis[:h1, :w1,:3] = img1
    vis[:h2, w1:w1+w2,:3] = img2
    • Gracias… Esta hecho maravillas para mí!
  3. 15
    import numpy as np, cv2
    
    img1 = cv2.imread(fn1, 0)
    img2 = cv2.imread(fn2, 0)
    h1, w1 = img1.shape[:2]
    h2, w2 = img2.shape[:2]
    vis = np.zeros((max(h1, h2), w1+w2), np.uint8)
    vis[:h1, :w1] = img1
    vis[:h2, w1:w1+w2] = img2
    vis = cv2.cvtColor(vis, cv2.COLOR_GRAY2BGR)
    
    cv2.imshow("test", vis)
    cv2.waitKey()

    o si prefiere legado manera:

    import numpy as np, cv
    
    img1 = cv.LoadImage(fn1, 0)
    img2 = cv.LoadImage(fn2, 0)
    
    h1, w1 = img1.height,img1.width
    h2, w2 = img2.height,img2.width
    vis = np.zeros((max(h1, h2), w1+w2), np.uint8)
    vis[:h1, :w1] = cv.GetMat(img1)
    vis[:h2, w1:w1+w2] = cv.GetMat(img2)
    vis2 = cv.CreateMat(vis.shape[0], vis.shape[1], cv.CV_8UC3)
    cv.CvtColor(cv.fromarray(vis), vis2, cv.CV_GRAY2BGR)
    
    cv.ShowImage("test", vis2)
    cv.WaitKey()
    • cv2.COLOR_GRAY2BGR parece que no existe en OpenCV 2.3. Además de leer imágenes en escala de grises y convertirlos luego de vuelta a RGB. Así que el resultado va a ser en escala de grises ¿no?
    • Podemos hacer esto para imágenes a color??

Dejar respuesta

Please enter your comment!
Please enter your name here