2011-09-28 697 views
21

我試圖使用OpenCV 2.1將兩張圖片合併爲一張,兩張圖片彼此相鄰。在Python,我做:將兩張圖片與OpenCV結合起來

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

產生的圖像是:

enter image description here

它可能很難d從場地的其餘部分熄滅,但大部分圖像是白色的,對應於各個圖像應該在哪裏。黑色區域是沒有圖像數據寫入的地方。

爲什麼我的所有圖像數據都被轉換爲白色?

+0

你見過[find_obj.py樣品(https://code.ros.org/trac/opencv/browser/trunk/opencv/ samples/python2/find_obj.py)來自OpenCV 2.3.1?它看起來和你想要做的一模一樣。 –

+0

@Andrey,是的,這正是我試圖轉換爲OpenCV 2.1的原因。我沒有2.3並且無法編譯,所以我現在正在使用2.1。 – Cerin

+0

您也可以創建一個關於編譯問題的問題。我認爲這是可以解決的。請注意,此示例的flann部分不能用OpenCV 2.1實現,因爲flann索引的python綁定僅在2.3.1中添加。 –

回答

46

因爲你的圖片恰好是相同的尺寸(這是用於顯示圖像的處理結果的常見的情況)的情況下,你可以使用numpy的的串連簡化您的代碼。

要垂直堆疊(超過IMG2 IMG1):

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

要水平堆疊(IMG1到IMG2的左側):

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) 
+0

垂直和水平的代碼是一樣的嗎? – Dave

+2

我修復了複製粘貼錯誤。水平方向沿軸1.您可以輕鬆地自行嘗試。我在回覆中添加了驗證碼。 –

9
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() 
+1

cv2.COLOR_GRAY2BGR似乎在OpenCV 2.3中不存在。此外,您還可以讀取灰度圖像,然後將它們轉換回RGB。所以你的結果會不會是灰度的呢? – dmorlock

+2

我們可以爲彩色圖像做這個嗎? – Krish

7

對於那些正在尋求將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 
+0

謝謝...這爲我工作奇蹟! – Cypher

相關問題