【问题标题】:Warp Prespective of opencv not giving accurate result关于opencv的翘曲没有给出准确的结果
【发布时间】:2020-03-22 07:21:46
【问题描述】:

我想拼接两个具有部分重叠区域的图像来执行此操作,我正在使用 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()

【问题讨论】:

标签: python opencv image-stitching


【解决方案1】:

您的 warpPerspective 工作正常,但您没有获得足够的关键点匹配来让您的 warp 变成您想要的样子。尝试使用不同的关键点检测器,如 Brisk、KAZE 或 AKAZE,以及不同的关键点匹配器,如 Brute Force 或 K-Nearest Neighbors。

【讨论】:

  • 感谢 Aaron 的建议,我厌倦了 AKAZE KAZE ADN Brisk,但我得到的结果与问题中提到的相同。
  • 看起来您尝试拼接的图像非常相似,而 openCV 无法获得足够丰富的关键点来执行所需的操作。我可以通过创建掩码图像来解决这个问题,您可以在其中找到关键点、描述符、过滤器匹配、计算单应性等,但是一旦找到所有这些计算,您就可以将它们传递给原始图像以拼接在一起。
  • 谢谢 Aaron ...我有一个疑问,我完全没有明白你创建蒙版图像的意思?你的意思是说用其他图像掩盖我试图缝合的图像....
  • 创建两个宽度和高度与上面两个图像相同的图像,并在这些图像上找到具有关键点和描述符的匹配项。之后,找到单应矩阵,但不是将您创建的两个图像拼接在一起,而是将计算从掩码图像传递到您尝试拼接在一起的实际图像,然后它应该可以工作。
  • Araon 我发现扭曲透视在我的情况下不起作用......所以我可以从关键点获取 (x,y) ,然后将一个图像转换为另一个图像在公共区域?
猜你喜欢
  • 2020-08-23
  • 2013-07-01
  • 1970-01-01
  • 2019-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-13
  • 1970-01-01
相关资源
最近更新 更多