【问题标题】:Using python with opencv to achieve image splicing使用python配合opencv实现图像拼接
【发布时间】:2017-09-02 09:30:53
【问题描述】:

有两张图片,它们具有相同的区域例如:

我想拼接两张图片。我的代码如下

import numpy as np
import cv2

leftImg = cv2.imread('D:\\1.jpg')
rightImg = cv2.imread('D:\\2.jpg')
leftgray=cv2.cvtColor(leftImg,cv2.COLOR_BGR2GRAY)
rightgray=cv2.cvtColor(rightImg,cv2.COLOR_BGR2GRAY)

hessian=400
surf=cv2.SURF(hessian)
kp1,des1=surf.detectAndCompute(leftgray,None)
kp2,des2=surf.detectAndCompute(rightgray,None)


FLANN_INDEX_KDTREE=0
indexParams=dict(algorithm=FLANN_INDEX_KDTREE,trees=5)
searchParams=dict(checks=50)
flann=cv2.FlannBasedMatcher(indexParams,searchParams)
matches=flann.knnMatch(des1,des2,k=2)

h,w=leftgray.shape[:2]
good=[]
for m,n in matches:
    if m.distance < 0.7*n.distance:
        good.append(m)

src_pts = np.array([ kp1[m.queryIdx].pt for m in good])
dst_pts = np.array([ kp2[m.trainIdx].pt for m in good])
H=cv2.findHomography(src_pts,dst_pts)
dst_corners=cv2.warpPerspective(leftgray,H,(w*2,h))

dst_corners[0:h,w:w*2]=rightgray
cv2.imwrite('tiled.jpg',dst_corners)
cv2.imshow('tiledImg',dst_corners)

cv2.waitKey()
cv2.destroyAllWindows()

但我搞错了,那就是

dst_corners=cv2.warpPerspective(leftgray,H,(w*2,h))

TypeError: M is not a numerical tuple

我该怎么办?请告诉我如何实现该功能,非常感谢!

【问题讨论】:

  • 你知道如何使用python实现图像中字体(字符/数字)的复制移动伪造吗?

标签: python python-2.7 opencv image-processing


【解决方案1】:

如果你打印单应矩阵,你就会明白你的错误。将此行更改为。

dst_corners=cv2.warpPerspective(leftgray,H[0],(w*2,h))

【讨论】:

  • @chaoCN 我想实现图像拼接,我试过你的代码,但我得到以下错误 surf=cv2.SURF(hessian) AttributeError: module 'cv2.cv2' has no attribute 'SURF' Process finished with退出代码 1
【解决方案2】:

按照this solution 中的建议,您应该更改行

H, mask =cv2.findHomography(src_pts,dst_pts)

并分离输出

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-26
    • 2020-03-10
    • 1970-01-01
    • 2011-08-26
    • 2021-10-03
    • 2019-01-01
    • 2019-06-05
    • 2015-05-03
    相关资源
    最近更新 更多