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

news2024/9/23 11:18:19

项目场景:

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


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()

问题描述

报错
在这里插入图片描述

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

在Python编程中,我们常常会遇到"ValueError: not enough values to unpack (expected 2, got 1)"的错误。这个错误通常出现在我们试图从一个对象中解包多个值,但实际上该对象中只包含了一个值。为了解决这个问题,我们可以采取以下方法和建议。

首先,我们需要仔细检查进行解包操作的对象。确保该对象包含了我们期望的多个值。如果对象只包含了一个值,那么我们需要重新审视我们的逻辑,或者修改解包操作的方式。

其次,我们还需要检查解包操作的返回值。错误常常是因为我们调用的函数或方法返回的值不符合我们期望的多个值的情况。为了避免这个错误,我们应该仔细查看解包操作的返回值,确保它与我们期望的值的数量相匹配。如果有必要,可以修改函数或方法的实现,确保它返回正确数量的值。

如果我们确定解包操作的返回值无法满足我们期望的多个值的数量,我们可以考虑使用默认值或者异常处理来解决这个问题。使用默认值意味着我们为解包操作的变量提供一个默认值,这样即使返回值不足以解包,我们的代码也不会出错。另一种方法是使用异常处理来捕获解包操作失败的情况,并在出错时执行特定的操作,以避免程序终止。

总的来说,要解决"ValueError: not enough values to unpack (expected 2, got 1)"错误,我们需要仔细检查解包操作的对象和返回值,确保它们符合我们期望的多个值的数量。根据具体情况,我们可以选择修改逻辑、调整解包方式,或者使用默认值和异常处理,从而更好地处理和操作解包操作,避免出现这个错误。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1079900.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vuex的使用,详细易懂

目录 一.前言 二.Vuex的简介 三.vuex的使用 3.1 安装Vuex 3.2 使用Vuex的步骤&#xff1a; 四.vuex的存值取值&#xff08;改变值&#xff09; 五.vuex的异步请求 好啦&#xff0c;今天的分享就到这啦&#xff01;&#xff01;&#xff01; 一.前言 今天我们继续前面的E…

openGauss Meetup(天津站.10月13日),欢迎报名

由openGauss社区、天开发展集团、天津市软件行业协会、天大智图&#xff08;科技&#xff09;有限公司联合主办,天津鲲鹏生态创新中心、天津市计算机学会、天津市人工智能学会、天津市系统集成协会、麒麟软件有限公司、天津南大通用数据技术股份有限公司、AI知学社协办的“open…

【Vuex+ElementUI】Vuex中取值存值以及异步加载的使用

一、导言 1、引言 Vuex是一个用于Vue.js应用程序的状态管理模式和库。它建立在Vue.js的响应式系统之上&#xff0c;提供了一种集中管理应用程序状态的方式。使用Vuex&#xff0c;您可以将应用程序的状态存储在一个单一的位置&#xff08;即“存储”&#xff09;中&#xff0c;…

北斗高精度定位为无人车成为机场运营新常态提供技术保障

在现代快节奏的生活中&#xff0c;人们对交通效率和安全性的需求越来越高。为了满足这一需求&#xff0c;无人驾驶技术被广泛研究和应用。而随着北斗卫星系统的发展&#xff0c;机场无人车正成为潜在的未来运输解决方案。本文将深入探讨北斗卫星如何改变机场运营&#xff0c;以…

Vega Prime入门教程14.01:调用VAPS XT DLL

本文首发于&#xff1a;Vega Prime入门教程14.01&#xff1a;调用VAPS XT DLL 在VAPS XT系列教程中提到过Vega Prime可以直接调用Drawing Integration生成的dll&#xff0c;本文来测试这个功能效果。 本系列使用的是VP18.0&#xff0c;使用的是VC14.0&#xff08;VS2015&…

java装箱和拆箱

package daysreplace;import com.sun.jdi.IntegerValue;import java.util.Arrays;public class Test {public static void main(String[] args) {//装箱&#xff1a;自动将基本数据类型转成包装类 基本数据类型->包装类型//拆箱&#xff1a;自动将包装类转成基本数据类型 包…

【LeetCode:2512. 奖励最顶尖的 K 名学生 | 模拟+哈希表+堆】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

练[GYCTF2020]EasyThinking

[GYCTF2020]EasyThinking 文章目录 [GYCTF2020]EasyThinking掌握知识解题思路还得靠大佬正式开始 关键paylaod 掌握知识 ​ thinkphpV6任意文件操作漏洞&#xff0c;代码分析写入session文件的参数&#xff0c;源码泄露&#xff0c;使用蚁剑插件disable_functions绕过终端无回…

Android Native 开发 要点实录

Android Studio 中写 C 代码 android studio创建C项目_android studio native c-CSDN博客 项目配置参考 【CMake】CMakeLists.txt的超傻瓜手把手教程&#xff08;附实例源码&#xff09;_【cmake】cmakelists.txt的超傻瓜手把手教程(附实例源码)-CSDN博客 CMakeLists.txt 讲解…

一文区分路由策略和策略路由!

一、路由策略 在复杂的数据通信网络中&#xff0c;根据实际组网需求&#xff0c;往往需要实施一些路由策略对路由信息进行过滤、属性设置等操作&#xff0c;通过对路由的控制&#xff0c;可以影响数据流量转发。路由策略并非单一的技术或者协议&#xff0c;而是一个技术专题或…

MongoDB——centOS7环境Mongodb权限管理(图解版)

目录 一、MongDB权限概述1.1、MongDB权限概述1.2、MongDB权限列表 二、Mongodb权限管理示例2.1、创建账号2.1.1、创建管理员用户2.1.2、开启认证2.1.3、创建普通账号 一、MongDB权限概述 1.1、MongDB权限概述 mongodb是没有默认管理员账号&#xff0c;所以要先添加管理员账号…

界面组件DevExpress WPF v23.1 - 进一步升级数据处理能力

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…

帝国cms改目录后打不开,帝国cms改目录生成后还是404

帝国CMS更改了网站域名或者栏目目录地址信息打不开的解决方法&#xff0c;一起来看看吧&#xff1a; 很多的小伙伴们&#xff0c;改了后台的系统设置里面的网站地址或者栏目目录地址&#xff0c;信息页就打不开的解决方法如下&#xff1a; 后台>系统>数据更新>更新信…

防雷排插的防雷应用以及解决方案

防雷排插是一种能够有效防止雷电对电器设备造成损坏的电源插座。防雷排插的应用&#xff0c;原理和作用如下&#xff1a; 地凯科技防雷排插的应用&#xff1a;防雷排插主要用于保护电脑&#xff0c;电视&#xff0c;音响等电子设备免受雷击或者电网过压的影响。防雷排插通常有…

Delphi如何为Win32位和Win64位不同的目标平台分别编译生成不同文件名的EXE可执行文件

实际上就是给编译生成的exe文件自动重命名不同的名称&#xff1a; 实测《Z-Gantt时间管理进度计划甘特图》Delphi 10.3.3 成功&#xff0c;网上说Delphi xe3 以上版本都可以&#xff0c; delphi 7 不可以。 进入 Project Options - Build Events &#xff0c; 然后在 post-bui…

华为云云耀云服务器L实例评测 | 实例评测使用之硬件参数评测:华为云云耀云服务器下的 Linux 磁盘目录分析神器 ncdu

华为云云耀云服务器L实例评测 &#xff5c; 实例评测使用之硬件参数评测&#xff1a;华为云云耀云服务器下的 Linux 磁盘目录分析神器 ncdu 介绍华为云云耀云服务器 华为云云耀云服务器 &#xff08;目前已经全新升级为 华为云云耀云服务器L实例&#xff09; 华为云云耀云服务器…

【C++进阶】:智能指针

智能指针 一.为什么需要智能指针二.智能指针的原理和使用1.RALL2.auto_ptr3.unique_ptr4.shared_ptr 一.为什么需要智能指针 主要两点原因&#xff1a; 1.为了避免写代码时忘记delete导致的内存泄漏。 2.为了避免抛异常时跳过delete导致的内存泄漏。 1.new本身有可能出现异常&…

如何导出带有材质的GLB模型?

1、为什么要使用 GLB 模型? GLB格式&#xff08;GLTF Binary&#xff09;是一种用于存储和传输3D模型及相关数据的文件格式&#xff0c;具有以下优点和作用&#xff1a; 统一性&#xff1a;GLB是一种开放标准的3D文件格式&#xff0c;由Khronos Group制定和维护。它融合了GL…

BUUCTF [BJDCTF2020]JustRE 1

查看文件信息 使用IDA打开 shift F12搜索字符串 发现类似flag的字符串 点进去 一路跟踪到汇编窗口&#xff0c;然后F5 sprintf将格式化后的字符串输出到String中 最终String的值为 printf("BJD{%d%d2069a45792d233ac}",19999,0);也就是 BJD{1999902069a45792d…

混淆技术研究笔记(四)反篡改介绍

先来看看AI的介绍&#xff0c;为了防止Java代码打包的JAR包被篡改&#xff0c;可以采取以下几种措施&#xff1a; 使用数字签名&#xff1a;可以使用Java的签名工具&#xff08;如Jarsigner&#xff09;对JAR包进行数字签名。签名可以确保JAR包的完整性和来源可信性。在验证JAR…