2017-07-16 66 views
1

我已经按照Python中的opencv教程。我正在使用OpenCV 3.2和Python 3.6.1。该代码是这样写的:功能匹配+单应

import cv2 
import numpy as np 
import matplotlib.pyplot as plt 

MIN_MATCH_COUNT = 10 

img1 = cv2.imread('test.jpg',0) 
img2 = cv2.imread('hanapin_mo.jpg',0) 

sift = cv2.xfeatures2d.SIFT_create() 

kp1, des1 = sift.detectAndCompute(img1,None) 
kp2, des2 = sift.detectAndCompute(img2,None) 

FLANN_INDEX_KDTREE = 1 
index_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5) 
search_params = dict(checks = 50) 

flann = cv2.FlannBasedMatcher(index_params, search_params) 

matches = flann.knnMatch(des1, des2, k = 2) 

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

if len(good)>MIN_MATCH_COUNT: 
    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) 

    M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0) 
    matchesMask = mask.ravel().tolist() 

    h,w,d = img1.shape 
    pts = np.float32([ [0,0],[0,h-1],[w-1,h-1],[w-1,0] ]).reshape(-1,1,2) 
    dst = cv2.perspectiveTransform(pts,M) 

    img2 = cv2.polylines(img2,[np.int32(dst)], True, 255, 3, cv2.LINE_AA) 

else: 
    print("Not enough matches are found - {}/{}".format(len(good), MIN_MATCH_COUNT)) 
    matchesMask = None 

draw_params = dict(matchColor = (0,250,0), 
        singlePointColor = None, 
        matchesMask = matchesMask, 
        flags = 2) 

img3 = cv2.drawMatchesKnn(img1, kp1, img2, kp2, good, None, **draw_params) 

plt.imshow(img3, 'gray'),plt.show() 

当我运行模块,发生错误:

回溯(最近通话最后一个): 文件“C:/用户/阿尔伯特礼雷耶斯/台式机/ SIFT/SIFT.py” 35行,在 H,W,d = img1.shape ValueError异常:没有足够的数值解压缩(预计3,拿到2)

h,w,d = img1.shape 
    pts = np.float32([ [0,0],[0,h-1],[w-1,h-1],[w-1,0] ]).reshape(-1,1,2) 
    dst = cv2.perspectiveTransform(pts,M) 

    img2 = cv2.polylines(img2,[np.int32(dst)], True, 255, 3, cv2.LINE_AA) 

是什么意思时,它说“没有足够的价值来解包”?我应该怎么做才能让它运行?

回答

1

形状函数只输出两个值的元组。您想获得三个值,而函数只返回

h,w = img1.shape 

两个值以上会工作

+1

我已经试过了一部分,但它给了我这样的错误: 回溯(最近通话最后一个): 文件“C:/用户/阿尔伯特礼雷耶斯/桌面/ SIFT/SIFT_2.py” ,第50行,在 img3 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,good,None,** draw_params) SystemError:<内置函数drawMatchesKnn>返回NULL,不会设置错误 –

+0

这是整个其他问题。为此提出另一个问题。你在问题中提出的追溯是造成我上面提到的问题。 –

+0

好的。感谢您的回答:) –

1

那么,这意味着img1.shape回报只有两个值。因此,如果您删除d变量初始化,则代码应该工作,因为我没有看到您在代码中使用它。

h, w = img1.shape 
+0

感谢您的回答:) –

+0

@AlbertReyes欢迎您,对不起,重复 –