我正在使用 Python (3) 和 OpenCV (3.3) 在网络摄像头上运行实时对象检测,使用样本图像,然后与视频流进行特征匹配。我已经使用 SIFT/SURF 让它工作,但我正在尝试使用 ORB 算法。在某些情况下,我收到以下错误导致程序崩溃:for i, (m, n) in enumerate(matches):ValueError: not enough values to unpack (expected 2, got 1)我理解崩溃背后的原因,有时图像之间有很好的匹配,有时没有,导致不匹配。我的问题是,如何强制程序忽略并跳过没有足够值的情况并继续运行。有问题的主要代码区域: for i, (m, n) in enumerate(matches): if m.distance < 0.7*n.distance: good.append(m)“匹配”输出示例:[[<DMatch 0x11bdcc030>, <DMatch 0x11bbf20b0>], [<DMatch 0x11bbf2490>, <DMatch 0x11bbf24f0>], [<DMatch 0x11bbf2750>, <DMatch 0x11bbf25d0>], [<DMatch 0x11bbf2570>, <DMatch 0x11bbf2150>], etc etc完整代码:import numpy as npimport cv2from matplotlib import pyplot as pltimport matplotlib.patches as mpatchesimport os, os.pathimport mathimport timefrom datetime import datetimestartTime = datetime.now()MIN_MATCH_COUNT = 10 # default=10img1 = cv2.imread('Pattern3_small.jpg',0) # queryImage# Create ORB object. You can specify params here or later.orb = cv2.ORB_create()cap = cv2.VideoCapture(0)# cap = cv2.VideoCapture("output_H264_30.mov")# find the keypoints and descriptors with SIFTkp1, des1 = orb.detectAndCompute(img1,None)pts_global = []dst_global = []position = []heading = []# plt.axis([0, 1280, 0, 720])tbl_upper_horiz = 1539tbl_lower_horiz = 343tbl_upper_vert = 1008tbl_lower_vert = 110# cv2.namedWindow("Frame", cv2.WINDOW_NORMAL)# cv2.resizeWindow("Frame", 600,350)while True: _, img2 = cap.read() # Start timer timer = cv2.getTickCount() # find the keypoints and descriptors with SIFT # kp1, des1 = sift.detectAndCompute(img1,None) kp2, des2 = orb.detectAndCompute(img2,None) FLANN_INDEX_KDTREE = 0 FLANN_INDEX_LSH = 6 # index_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5) index_params= dict(algorithm = FLANN_INDEX_LSH, table_number = 6, # 12, 6 key_size = 12, # 20, 12 multi_probe_level = 1) #2, 1
2 回答
沧海一幻觉
TA贡献1824条经验 获得超5个赞
将 的每个元素matches视为一个集合并使用异常处理:
for i, pair in enumerate(matches):
try:
m, n = pair
if m.distance < 0.7*n.distance:
good.append(m)
except ValueError:
pass
当年话下
TA贡献1890条经验 获得超9个赞
如果你这样做:
for i, (m, n) in enumerate(matches):
并且您不能保证所有元组始终包含两个元素,那么您应该执行以下操作:
for i, values in enumerate(matches):
if len(values) < 2:
continue # you don't have the second element to compare against
...
# Do your usual processing here
上面的代码是明确的和可读的,即很明显,您需要两个元素才能在处理链中进一步进行。它也不太容易出错,因为您要确保有正确的数据可以继续。它还允许您计算丢弃了多少元组。
添加回答
举报
0/150
提交
取消