- 追加された行はこのように表示されます。
- 削除された行は
このように表示されます。
! 簡易パノラマを OPENCV とpython です
# matching features of two images
import cv2
import sys
import scipy as sp
import numpy as np
if len(sys.argv) < 3:
print 'usage: %s img1 img2' % sys.argv[0]
sys.exit(1)
img1_path = sys.argv[1]
img2_path = sys.argv[2]
img1 = cv2.imread(img1_path, cv2.IMREAD_GRAYSCALE)
img2 = cv2.imread(img2_path, cv2.IMREAD_GRAYSCALE)
# detector = cv2.ORB_create()
detector = cv2.AKAZE_create()
kp1, des1 = detector.detectAndCompute(img1, None)
kp2, des2 = detector.detectAndCompute(img2, None)
print '#keypoints in image1: %d, image2: %d' % (len(kp1), len(kp2))
# # descriptors
# match the keypoints
matcher = cv2.BFMatcher(cv2.NORM_HAMMING)
matches = matcher.match(des1, des2)
# visualize the matches
print '#matches:', len(matches)
dist = [m.distance for m in matches]
print 'distance: min: %.3f' % min(dist)
print 'distance: mean: %.3f' % (sum(dist) / len(dist))
print 'distance: max: %.3f' % max(dist)
# threshold: half the mean
thres_dist = (sum(dist) / len(dist)) * 0.5
# keep only the reasonable matches
sel_matches = [m for m in matches if m.distance < thres_dist]
print '#selected matches:', len(sel_matches)
# #####################################
# visualization
h1, w1 = img1.shape[:2]
h2, w2 = img2.shape[:2]
#
view = sp.zeros((max(h1, h2), (w1 + w2), 3), sp.uint8)
# view = sp.zeros((max(int(h1*1.2), int(h2*1.2)), int((w1 + w2)*1.5), 3), sp.uint8)
# view = sp.zeros(((h1+ h2), w1 + w2, 3), sp.uint8)
## src_pts = np.float32([ kp1[m.queryIdx].pt for m in good ]).reshape(-1,1,2)
## dst_pts = np.float32([ kp2[m.trainIdx].pt for m in good ]).reshape(-1,1,2)
src_pts = np.float32([ kp1[m.queryIdx].pt for m in sel_matches ]).reshape(-1,1,2)
dst_pts = np.float32([ kp2[m.trainIdx].pt for m in sel_matches ]).reshape(-1,1,2)
## M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC,5.0)
M, mask = cv2.findHomography(src_pts, dst_pts)
# matchesMask = mask.ravel().tolist()
## dst = cv2.warpPerspective(img1,mask,(h1*1.5,w1*1.1))
### dst = cv2.warpPerspective(img1,M,((h1*1.5).integer(),(w1*1.1).integer()))
# src1 = cv2.warpPerspective(img1,M,(w1,h1))
# dst2 = cv2.warpPerspective(img2,M,(w2,h2))
#
# src1 = cv2.warpPerspective(img1,M,(int(w1*1.5),int(h1*1.1)))
# dst2 = cv2.warpPerspective(img2,M,(int(w2*1.5),int(h2*1.1)))
src1 = cv2.warpPerspective(img1,M,(int(w1*1.5),int(h1*1.1)))
for yy in range(w2):
for xx in range(h2):
src1[xx,yy] = img2[xx,yy]
## cv2.imshow("view", view)
cv2.imshow("view", src1)
## cv2.imshow("img1", img1)
## cv2.imshow("img2", img2)
## cv2.imshow("dest1", src1)
## cv2.imshow("dest2", dst2)
#
cv2.waitKey()