OpenCV 2.1を使用して2つの画像を1つに結合しようとしています。2つの画像は互いに隣接しています。 Pythonでは、私はやっています:
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()
2つの入力画像は次のとおりです。
https://code.ros.org/trac/opencv/browser/trunk/opencv/samples/c/box.png?rev=227
https://code.ros.org/trac/opencv/browser/trunk/opencv/samples/c/box_in_scene.png?rev=227
結果の画像は次のとおりです。
サイトの他の部分と区別するのは難しいかもしれませんが、画像のほとんどは、個々の画像があるべき場所に対応する白色です。黒い領域は、画像データが書き込まれなかった場所です。
画像データがすべて白に変換されるのはなぜですか?
画像が同じサイズになる場合(画像処理結果を表示するための一般的なケース)、numpyの連結を使用してコードを簡素化できます。
垂直にスタックするには(img1の上にimg1):
vis = np.concatenate((img1, img2), axis=0)
水平方向にスタックするには(img2の左側の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 カラー画像を1つにまとめることを考えている人にとっては、これはAndreyの答えを少し修正したもので、私にとってはうまくいきました。
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
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()