Деформация перспективы OpenCV не дает точного результата - PullRequest
0 голосов
/ 22 марта 2020

Я хочу сшить два изображения с частичным перекрытием области, чтобы сделать это, я использую OpenCV. После сопоставления ключевых точек с использованием orb и flann и нахождения гомографии я выполнил перспективу деформации, но не получил требуемого результата. Я не понимаю, что я делаю неправильно, я новичок в этом, пожалуйста, помогите. Я прилагаю код

    # -*- coding: utf-8 -*-
import numpy as np
import cv2
from matplotlib import pyplot as plt
def rotated(img):
   (h,w)=img.shape[:2]
   center=(w / 2,h / 2)
   m=cv2.getRotationMatrix2D(center,359.5,1)
   rotate=cv2.warpAffine(img,m,(w,h))
   plt.imshow(rotate)
   plt.show()
   return rotate



d=(600,400)
img2= cv2.imread('G:/mca6thsem/bulletsimages/a31/a22/5500k/land2_part1.jpeg')
img1 = cv2.imread('G:/mca6thsem/bulletsimages/a31/a22/5500k/land2prt2.jpeg')
img1=cv2.resize(img1,d)
img1=rotated(img1)
img2=cv2.resize(img2,d)
img2=rotated(img2)
orb = cv2.ORB_create()
kp, des= orb.detectAndCompute(img1, None)
kp1, des1 = orb.detectAndCompute(img2, None)




imgor = cv2.drawKeypoints(img1,kp,None,color=(0,255,0))
imgor1 = cv2.drawKeypoints(img2,kp1,None,color=(0,255,0))
#flann
FLANN_INDEX_LSH=0
index_params= dict(algorithm = FLANN_INDEX_LSH,
                   table_number = 6, # 12
                   key_size = 12,     # 20
                   multi_probe_level = 1) #2
search_params = dict(checks=30)
flann = cv2.FlannBasedMatcher(index_params,search_params)

matches = flann.knnMatch(np.float32(des),np.float32(des1),k=2)



good = []
for m,n in matches:
    if m.distance < 0.9*n.distance:
        good.append(m)

if len(good)>10:
    src_pts = np.float32([ kp[m.queryIdx].pt for m in good ]).reshape(-1,1,2)
    dst_pts = np.float32([ kp1[m.trainIdx].pt for m in good ]).reshape(-1,1,2)
    M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC,5.0)
    matchesMask = mask.ravel().tolist()
    h = img1.shape[1]
    w= img1.shape[0]




dst = cv2.warpPerspective(img2,M,(img2.shape[1] + img1.shape[1], img2.shape[0]))
dst[0:img1.shape[0],0:img1.shape[1]]=img1

draw_params = dict(matchColor = (0,255,0), # draw matches in green color
                   singlePointColor = None,
                   matchesMask = matchesMask, # draw only inliers
                   flags = 2)

img3 = cv2.drawMatches(img1,kp,img2,kp1,good,None,**draw_params)

plt.imshow(img3, 'gray'),plt.show()
#im1Reg=cv2.resize(im1Reg,d)
plt.imshow(dst, 'gray'),plt.show()

drawing of matching keypointsafter wrap prespective i get this

1 Ответ

1 голос
/ 22 марта 2020

Ваш warpPerspective работает правильно, но вы не получаете достаточно совпадений ключевых точек, чтобы ваш варп получился так, как вы хотите. Попробуйте использовать другой детектор ключевых точек, таких как Brisk, KAZE или AKAZE, и различные сопоставители ключевых точек, такие как Brute Force или K-Nearest Neighbours.

...