当接收 "ValueError: 没有足够的值解包 (预期 2, 得到 1)" 时, 如何强制程序忽略并继续?

共2个回答, 标签: python opencv enumerate orb flann

我使用 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)

示例 "匹配" 输出:

[[, ], [, ], [, ], [, ], 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
    search_params = dict(checks = 50)

    flann = cv2.FlannBasedMatcher(index_params, search_params)

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

    # print (matches)

    # Calculate Frames per second (FPS)
    fps = cv2.getTickFrequency() / (cv2.getTickCount() - timer);

    # store all the good matches as per Lowe's ratio test.
    good = []

    # ratio test as per Lowe's paper
    for i, (m, n) in enumerate(matches):
        if m.distance < 0.7*n.distance:
            good.append(m)

# Do something afterwards

谢谢你的帮助。

第1个答案

将每个元素视为 matches 集合并使用异常处理:

for i, pair in enumerate(matches):
    try:
        m, n = pair
        < 0.7*n.distance:="" good.append(m)="" except="" valueerror:="" pass="">
第2个答案

如果您要执行此操作:

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="">

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

相关问题

通过随机抽样其他列数据创建新列 如何使用熊猫获得包括每一个组合的计数 如何有效地展开矩阵的值与小块? 用 OpenCV 自动调整一张纸的彩色照片的对比度和亮度 检测图像是否倒置 提取矩形的尺寸 当接收 "ValueError: 没有足够的值解包 (预期 2, 得到 1)" 时, 如何强制程序忽略并继续?