我想做一个有关徽标检测的简单项目。因此,我尝试遵循有关特征检测的OpenCV-Python教程。 OpenCV: Feature Matching
我写了如下代码。
ratio = 0.8
logo = cv.imread("T01/CocaCola_logo2.png", cv.IMREAD_GRAYSCALE)
img = cv.imread("T01/CocaCola.png", cv.IMREAD_GRAYSCALE)
orb = cv.ORB_create()
kp_logo, des_logo = orb.detectAndCompute(logo, None)
kp_img, des_img = orb.detectAndCompute(img, None)
FLANN_INDEX_LSH = 6
index_params = dict(algorithm=FLANN_INDEX_LSH,
table_number=6,
key_size=12,
multi_probe_level=1)
search_params = dict(checks=50)
flann = cv.FlannBasedMatcher(index_params, search_params)
match_flann = flann.knnMatch(des_logo, des_img, k=2)
good = []
for p, q in match_flann:
if p.distance > q.distance*ratio:
good.append(p)
try:
img_match = np.empty((max(logo.shape[0], img.shape[0]), logo.shape[1] + img.shape[1], 3), dtype=np.uint8)
cv.drawMatchesKnn(logo, kp_logo, img, kp_img, good,
outImg=img_match, matchColor=None, singlePointColor=(255, 255, 255), flags=2)
cv.imshow("flann matching", img_match)
cv.waitKey(0)
except:
print("...")
此代码无法正常工作。使用drawMatchesKnn()总是会错误处理进程。在向该函数添加try-except之前,进程发生系统错误: SystemError:返回NULL且未设置错误
问题的原因是什么?我尝试搜索了很长时间,但对我来说并不容易。
堆栈跟踪: 追溯(最近一次通话): 文件“ C:/Users/choib/Desktop/openCVtest3/T01_ORBtest.py”,在第73行中 cv.drawMatchesKnn(徽标,kp_logo,img,kp_img,良好,outImg = img_match,matchColor = None,singlePointColor =(255、255、255),标志= 2) SystemError:未设置错误就返回NULL
答案 0 :(得分:0)
我误解了drawMatches()和drawMatchesKnn()。 reference
drawMatchesKnn()需要获取由DMatch的向量组成的向量,例如matchs1to2。因此,就我而言,我修复了如下代码。
案例1:正确使用
img_match = np.empty((max(logo.shape[0], img.shape[0]), logo.shape[1] + img.shape[1], 3), dtype=np.uint8)
cv.drawMatches(logo, kp_logo, img, kp_img, good_flann,
outImg=img_match, matchColor=None, singlePointColor=(255, 255, 255), flags=2)
cv.imshow("flann matching", img_match)
cv.waitKey(0)
情况2:使用drawMatchesKnn()
img_match = np.empty((max(logo.shape[0], img.shape[0]), logo.shape[1] + img.shape[1], 3), dtype=np.uint8)
cv.drawMatchesKnn(logo, kp_logo, img, kp_img, match_flann,
outImg=img_match, matchColor=None, singlePointColor=(255, 255, 255), flags=2)
cv.imshow("flann matching", img_match)
cv.waitKey(0)
在这些代码中,good_flann只是DMatch的向量。并且match_flann是向量的向量。因此,这些部分的处理没有任何问题。
答案 1 :(得分:0)
我收到此错误是因为我试图通过将drawMatchesKnn
对象的列表传递给它来绘制与DMatch
的匹配项。但是,drawMatchesKnn
需要一个列表列表,每个列表包含DMatch
个对象。