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


    项目场景:

    在使用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()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57

    问题描述

    报错
    在这里插入图片描述

    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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    原因分析:

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

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

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

    解决方案:

    导致这个问题的原因是因为不同版本的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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

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

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

    方法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/"
    
    • 1
    • 2

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

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

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

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

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

  • 相关阅读:
    c和c++的强制类型转换
    Stable Diffusion WebUI报错RuntimeError: Torch is not able to use GPU解决办法
    String、StringBuffer、StringBuilder的区别
    Linux入门第二讲
    ant design vue 表单出错,滚动到对应项
    DCA培训心得笔记(二)
    微服务06-Dockerfile自定义镜像+DockerCompose部署多个镜像
    R语言应用interactionR包进行亚组相加交互作用分析
    数字档案室建设评价
    rabbitMQ的exchanages类型以及使用场景
  • 原文地址:https://blog.csdn.net/weixin_47869094/article/details/133744935