本文主要是介绍[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)]的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!