[ValueError: not enough values to unpack (expected 3, got 2)]

2023-10-10 15:04

本文主要是介绍[ValueError: not enough values to unpack (expected 3, got 2)],希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

项目场景:

在使用opencv进行关键点识别、边缘轮廓提取的时候,提示以上错误。


import cv2
import numpy as npdef preprocess(image):# 进行图像预处理(例如灰度化、高斯模糊等)gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)blurred = cv2.GaussianBlur(gray, (5, 5), 0)kernal = np.ones((5, 5), np.uint8)blurred = cv2.erode(blurred, kernal)  # 腐蚀blurred = cv2.erode(blurred, kernal)edges = cv2.Canny(blurred, 50, 150)return edgesdef get_object_contour(image):# 获取物体轮廓_, contours, _ = cv2.findContours(image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)if len(contours) > 0:# 找出最大的轮廓max_contour = max(contours, key=cv2.contourArea)# 进行多边形逼近epsilon = 0.02 * cv2.arcLength(max_contour, True)approx = cv2.approxPolyDP(max_contour, epsilon, True)# 绘制逼近的多边形cv2.drawContours(frame, [approx], 0, (0, 255, 0), 2)return approxreturn None# 打开摄像头
cap = cv2.VideoCapture(0)while True:ret, frame = cap.read()if not ret:break# 图像预处理及边缘检测edges = preprocess(frame)# 获取物体轮廓并进行多边形逼近approx = get_object_contour(edges)# 显示图像cv2.imshow('Object Detection', frame)# 按下ESC键退出if cv2.waitKey(1) == 27:break# 释放摄像头和窗口
cap.release()
cv2.destroyAllWindows()

问题描述

报错
在这里插入图片描述

D:\anaconda\python.exe "E:\yolo项目\Opencv-project-main\Opencv-project-main\CVZone\09 Object Size Measurement\3333.py" 
Traceback (most recent call last):File "E:\yolo项目\Opencv-project-main\Opencv-project-main\CVZone\09 Object Size Measurement\3333.py", line 115, in <module>approx = get_object_contour(edges)File "E:\yolo项目\Opencv-project-main\Opencv-project-main\CVZone\09 Object Size Measurement\3333.py", line 90, in get_object_contour_, contours, _ = cv2.findContours(image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
ValueError: not enough values to unpack (expected 3, got 2)Process finished with exit code 1

原因分析:

这个错误通常是由于尝试解包一个包含不足三个值的对象时引起的。在你的情况下,错误信息暗示了期望解包三个值,但实际上只提供了两个值。

以下是可能导致这个错误的一些常见情况和解决方法:

函数返回值与解包不匹配:有时,你可能在代码中调用一个函数,期望它返回一个包含三个值的元组或列表,但实际上它只返回了两个值。解决方法是检查函数的返回值,确保它返回了正确数量的值。解包的对象不是可迭代的:如果你尝试从一个不可迭代的对象中解包值,就会出现这个错误。确保你正在解包一个可迭代的对象,例如元组、列表或字典。错误的解包操作:检查你的代码中是否存在解包操作,确保它与你的预期相匹配。如果你只需要两个值,那么你应该使用两个变量来解包,而不是三个。

解决方案:

导致这个问题的原因是因为不同版本的OpenCV在findContours函数的参数数量上存在差异。在OpenCV的旧版本(例如OpenCV 3.x)中,findContours函数需要传递三个参数:输入图像、轮廓检测模式和轮廓逼近方法。而在较新的版本(例如OpenCV 4.x)中,findContours函数只需要传递两个参数:输入图像和轮廓检测模式。因此,如果你的代码在不同版本的OpenCV上运行,就会出现参数数量不匹配的错误。

为了解决这个问题,你有两个主要选择:

如果你要在不同版本的OpenCV上运行相同的代码,你可以使用条件语句来根据OpenCV版本选择正确的参数数量。例如:

import cv2# 获取OpenCV的版本信息
cv_version = cv2.__version__.split('.')[0]# 根据OpenCV版本选择findContours函数的参数数量
if cv_version == '3':_, contours, _ = cv2.findContours(image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
elif cv_version == '4':contours, _ = cv2.findContours(image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

解决方法
方法1
删除第一个参数,即代码改为:

    contours, _ = cv2.findContours(image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

方法2
修改opencv版本,降至opencv3
参考详细文章:
解决报错ValueError
可以降低OpenCV版本,建议选择opencv3.4.2.16
下载地址:地址1
地址2
地址3
Python3-ValueErro
Pycharm项目中更改python版本以及opencv版本

pip install opencv-python==3.4.2.16 -i "https://pypi.doubanio.com/simple/"
pip install opencv-contrib-python==3.4.2.16 -i "https://pypi.doubanio.com/simple/"

这篇关于[ValueError: not enough values to unpack (expected 3, got 2)]的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/181231

相关文章

【vue使用Sass报错】启动项目报错 Syntax Error: SassError: expected selector

出现的问题 新项目启动的时候,提示: Syntax Error: SassError: expected selector 看了一下发现是sass使用样式穿透/deep/报的错 /deep/其实是已经过期的写法,某个版本之后就不支持了 但是我同事并没有出现同样的问题,不知道是为啥,也有可能是电脑(mac)的原因 解决办法 将 /deep/更换为::v-deep 但是这个项目是多人协作的,有

Syntax error on token int, VariableDeclaratorId expected after this token

Syntax error on token "int", VariableDeclaratorId expected after this token,看图,   <item name=" " type="id"/>; 这个的name没有,看图 删掉这行就行了,R.java就不会报错了!!!!!!!!!!!

ValueError: could not convert string ‘date‘ to float64 at row 0, column 1.

ValueError:无法将字符串“date”转换为第0行第1列的float64。 解决办法: 通过以下代码检查自己的数据,查找问题,逐一改正。 import csvdef find_blank_or_invalid_cells(file_path):blank_cells = []invalid_cells = []with open(file_path, 'r', newline=

Page directive: illegal to have multiple occurrences of contentType with different values (x,X)之解

Question: Page directive: illegal to have multiple occurrences of contentType with different values (old: text/html; charset=utf-8, new: text/html;charset=UTF-8) Analysis: 出现这个的原因是这两个jsp的contentT

iReport利用Print Repeated Values做分组报表以及对重复值做distinct运算

iReport自带的分组功能有可能是比较符合西方的分组标准,对于中国人来说希望显示方便、节省纸张,对于iReport实现起来就稍微复杂一点了。 本文所用demo地址:http://download.csdn.net/detail/u013284604/6812623 iReport版本 5.1.0,demo所用数据源:json数据源 一、iReport利用Print Repeated Val

OpenAI Gym custom environment: Discrete observation space with real values

题意:OpenAI Gym 自定义环境:具有实数值的离散观测空间 问题背景: I would like to create custom openai gym environment that has discrete state space, but with float values. To be more precise, it should be a range of valu

Error when checking model target: expected activation_2 to have shape (None, 10) but got array with

我遇到了这个问题,因为我在用reshape层后,忘了改我的GT label的尺寸。 reshape最终的输出是10长度的,但是标签用的还是1长度的 就是(0,0,1,0,0,0,0,...)与3的不匹配

for 出错 ValueError: too many values to unpack (expected 2) 遍历多个变量

贼简单的代码示例 for [i,j] in [range(3),range(3)]:print(i,j) 输出: ValueError: too many values to unpack (expected 2) 正确示例 for i,j in zip(range(3),range(3)):print(i,j) 输出: 0 0 1 1 2 2 原因:后面zip()包装了两个lis

21. Map接口中keySet()、values()和entrySet()方法的区别是什么?它们各自返回什么内容?

在Java中,Map接口提供了keySet()、values()和entrySet()方法,这些方法用于访问Map中的不同部分。下面详细介绍它们的区别以及它们各自返回的内容。 1. keySet() 方法 作用: keySet()方法返回Map中所有键(Key)的集合。 返回类型: Set<K>,返回一个Set视图,包含了Map中所有的键。 使用场景: 当你只需要遍历或操作Map中的

跟《经济学人》学英文:2024年08月31日这期 How Abercrombie Fitch got hot again

How Abercrombie & Fitch got hot again The once-troubled brand is now a favourite of millennials and gen-Zs alike Abercrombie & Fitch(简称A&F)是一家美国著名的时尚品牌,成立于1892年。最初,A&F以其高端户外服装和运动装备而闻名,专为探险家和运动爱好者设计