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

news/2024/7/10 16:37:49 标签: YOLO, pytorch, 深度学习, bash, c++

项目场景:

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

bash">
import cv2
import numpy as np


def 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 edges


def 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 approx
    return 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()

问题描述

报错
在这里插入图片描述

bash">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版本选择正确的参数数量。例如:

bash">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
删除第一个参数,即代码改为:

bash">    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版本

bash">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/"

http://www.niftyadmin.cn/n/5078104.html

相关文章

视频监控系统EasyCVR如何通过API接口获取国标GB28181协议接入的实时录像?

安防监控视频汇聚平台EasyCVR基于云边端一体化架构&#xff0c;具有强大的数据接入、处理及分发能力&#xff0c;可提供视频监控直播、云端录像、云存储、录像检索与回看、智能告警、平台级联、云台控制、语音对讲、智能分析等功能。平台也提供丰富的API接口供开发者集成、调用…

数字三角形加强版,费马小定理求逆元,快速幂

Contest (nefu.edu.cn) Description 一个无限行的数字三角形&#xff0c;第 i 行有 i 个数。第一行的第一个数是 1 &#xff0c;其他的数满足如下关系&#xff1a;如果用 F[i][j] 表示第 i 行的第 j 个数&#xff0c;那么 F[i][j]A∗F[i−1][j]B∗F[i−1][j−1] &#xff08;…

ROS 工作空间及功能包

ROS工作空间&#xff08;workspace&#xff09;是一个存放工程开发相关文件的文件夹。 1. 什么是ROS的工作空间 使用ROS实现机器人开发的主要手段是写代码&#xff0c;这些代码文件存放的空间就是工作空间。 工作空间&#xff08;workspace&#xff09;是一个用于存放工程开发…

Java项目防止SQL注入的四种方案

文章目录 1. 使用预编译语句2. 输入验证和过滤3. 使用ORM框架4. 使用安全的数据库访问库总结 &#x1f389;欢迎来到Java学习路线专栏~Java项目防止SQL注入的四种方案 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&#xff1a;IT陈寒的博客&#x1f388;该系列文章…

OS Audit file could not be created; failing after 6 retries

下午有客户找过来&#xff0c;说数据库无法使用了&#xff0c;立刻查看alert日志&#xff0c;报错如下。 Sun Oct 08 12:46:59 2023 OS Audit file could not be created; failing after 6 retries Sun Oct 08 12:47:36 2023 OS Audit file could not be created; failing aft…

Linux学习记录——삼십이 协议、序列化和反序列化

文章目录 1、序列化、反序列化2、网络计算器1、套接字2、服务端和序列、反序列化部分1、制定协议&#xff0c;完成序列化、反序列化2、从网络中读取数据以及发送到网络中 3、客户端4、成熟的序列化反序列化方案 3、其它 UDP是面向数据报的&#xff0c;所以不用担心数据。TCP是面…

代码随想录算法训练营第63天|84.柱状图中最大的矩形

84.柱状图中最大的矩形 https://leetcode.cn/problems/largest-rectangle-in-histogram/ class Solution { public:int largestRectangleArea(vector<int>& heights) {vector<int> minLeft(heights.size());vector<int> minRight(heights.size());minL…

腾讯云2核4G轻量服务器5M带宽支持多少人同时在线?

腾讯云轻量2核4G5M带宽服务器支持多少人在线访问&#xff1f;5M带宽下载速度峰值可达640KB/秒&#xff0c;阿腾云以搭建网站为例&#xff0c;假设优化后平均大小为60KB&#xff0c;则5M带宽可支撑10个用户同时在1秒内打开网站&#xff0c;从CPU内存的角度&#xff0c;网站程序效…