为了账号安全,请及时绑定邮箱和手机立即绑定

当收到“ValueError: not enough values to unpack

当收到“ValueError: not enough values to unpack

UYOU 2022-01-05 20:20:05
我正在使用 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


查看完整回答
反对 回复 2022-01-05
?
当年话下

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

上面的代码是明确的和可读的,即很明显,您需要两个元素才能在处理链中进一步进行。它也不太容易出错,因为您要确保有正确的数据可以继续。它还允许您计算丢弃了多少元组。


查看完整回答
反对 回复 2022-01-05
  • 2 回答
  • 0 关注
  • 495 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信