当收到“ValueError: not enough values to unpack

我正在使用 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 np

import cv2

from matplotlib import pyplot as plt

import matplotlib.patches as mpatches

import os, os.path

import math

import time

from datetime import datetime

startTime = datetime.now()


MIN_MATCH_COUNT = 10   # default=10


img1 = 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 SIFT

kp1, des1 = orb.detectAndCompute(img1,None)


pts_global = []

dst_global = []


position = []

heading = []

# plt.axis([0, 1280, 0, 720])


tbl_upper_horiz = 1539

tbl_lower_horiz = 343

tbl_upper_vert = 1008

tbl_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



UYOU
浏览 500回答 2
2回答

沧海一幻觉

将 的每个元素matches视为一个集合并使用异常处理:for i, pair in enumerate(matches):&nbsp; &nbsp; try:&nbsp; &nbsp; &nbsp; &nbsp; m, n = pair&nbsp; &nbsp; &nbsp; &nbsp; if m.distance < 0.7*n.distance:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; good.append(m)&nbsp; &nbsp; except ValueError:&nbsp; &nbsp; &nbsp; &nbsp; pass

当年话下

如果你这样做:for i, (m, n) in enumerate(matches):并且您不能保证所有元组始终包含两个元素,那么您应该执行以下操作:for i, values in enumerate(matches): &nbsp; if len(values) < 2: &nbsp; &nbsp; continue # you don't have the second element to compare against &nbsp; ... &nbsp; # Do your usual processing here上面的代码是明确的和可读的,即很明显,您需要两个元素才能在处理链中进一步进行。它也不太容易出错,因为您要确保有正确的数据可以继续。它还允许您计算丢弃了多少元组。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python