gpt4 book ai didi

python - 收到 “ValueError: not enough values to unpack (expected 2, got 1)”时,如何强制程序忽略并继续?

转载 作者:行者123 更新时间:2023-12-02 17:05:23 25 4
gpt4 key购买 nike

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

我了解崩溃的原因,有时图像之间匹配良好,有时则不匹配,从而导致不匹配。

我的问题是,如何强制程序忽略并跳过没有足够值的情况并继续运行。

有问题的代码的主要 Realm :

    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

谢谢你的帮助。

最佳答案

matches的每个元素都视为一个集合,并使用异常处理:

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

except ValueError:
pass

关于python - 收到 “ValueError: not enough values to unpack (expected 2, got 1)”时,如何强制程序忽略并继续?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55612455/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com