При получении «ValueError: недостаточно значений для распаковки (ожидаемое 2, полученное 1)», как я могу заставить программу проигнорировать и продолжить? - PullRequest
0 голосов
/ 10 апреля 2019

Я использую 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
    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

Спасибо за любую помощь.

Ответы [ 2 ]

2 голосов
/ 10 апреля 2019

Рассматривать каждый элемент matches как коллекцию и использовать обработку исключений:

for i, pair in enumerate(matches):
    try:
        m, n = pair
        if m.distance < 0.7*n.distance:
            good.append(m)

    except ValueError:
        pass
0 голосов
/ 10 апреля 2019

Если вы делаете это:

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

Приведенный выше код является явным и читабельным, т. Е. Очевидно, что вам нужно два элемента для дальнейшего продвижения в цепочке обработки.Это также менее подвержено ошибкам, так как вы убедитесь, что у вас есть правильные данные для продолжения.Это также позволяет подсчитать, сколько кортежей было отброшено.

...