복붙노트

[PYTHON] OpenCV와 두 이미지 결합

PYTHON

OpenCV와 두 이미지 결합

OpenCV 2.1을 사용하여 두 이미지를 하나로 결합하려고합니다. 두 이미지는 서로 인접 해 있습니다. 파이썬에서는 다음과 같은 작업을 수행합니다.

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()

두 입력 이미지는 다음과 같습니다.

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

결과 이미지는 다음과 같습니다.

사이트의 나머지 부분과 구별하기 어려울 수 있지만 대부분의 이미지는 흰색이므로 개별 이미지가 있어야합니다. 검은 영역은 이미지 데이터가 기록되지 않은 영역입니다.

내 이미지 데이터가 모두 흰색으로 변환되는 이유는 무엇입니까?

해결법

  1. ==============================

    1.이미지 크기가 같아지면 (이미지 처리 결과를 표시하는 일반적인 경우) numpy의 연결을 사용하여 코드를 단순화 할 수 있습니다.

    이미지 크기가 같아지면 (이미지 처리 결과를 표시하는 일반적인 경우) numpy의 연결을 사용하여 코드를 단순화 할 수 있습니다.

    세로로 쌓으려면 (img1을 img2로) :

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

    가로로 스택하려면 (img1의 왼쪽에 img1) :

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

    확인하려면 :

    import cv2
    import numpy as np
    img = cv2.imread('img.png')
    vis = np.concatenate((img1, img2), axis=1)
    cv2.imwrite('out.png', vis)
    
  2. ==============================

    2.

    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()
    

    또는 기존 방식을 선호하는 경우 :

    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()
    
  3. ==============================

    3.2 개의 컬러 이미지를 하나로 결합하려는 사람들에게는, 이것은 나를 위해 일한 안드레이의 대답에 약간의 모드입니다 :

    2 개의 컬러 이미지를 하나로 결합하려는 사람들에게는, 이것은 나를 위해 일한 안드레이의 대답에 약간의 모드입니다 :

    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
    
  4. from https://stackoverflow.com/questions/7589012/combining-two-images-with-opencv by cc-by-sa and MIT license