contours, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) ValueError: too many values to unpack
时间: 2023-08-13 17:20:45 浏览: 89
这个错误通常是由于 OpenCV 的版本问题导致的。在 OpenCV 3 中,`findContours()` 函数返回两个值,分别是轮廓和层次信息。而在 OpenCV 4 中,该函数只返回轮廓信息一个值。
如果你使用的是 OpenCV 4,可以将代码中的下划线 `_` 去掉即可解决该问题。
如果你使用的是 OpenCV 3,可以将代码改为:
```python
_, contours, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
```
这样就可以正确地获取轮廓信息和层次信息了。
相关问题
报错如何解决,Exception in Tkinter callback Traceback (most recent call last): File "C:\Users\86135\AppData\Local\Programs\Python\Python39\lib\tkinter\__init__.py", line 1892, in __call__ return self.func(*args) File "F:\pycharm\实验5\Demo5_2.py", line 38, in count_cells _, contours, _ = cv2.findContours(self.thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) ValueError: not enough values to unpack (expected 3, got 2)
这个错误是因为cv2库在新的版本中,`cv2.findContours()`函数返回值的格式发生了改变。在旧版本中,返回值是3个,包括轮廓、层次结构和近似轮廓点。而在新版本中,返回值是2个,只包括轮廓和层次结构。
要解决这个错误,可以将代码中的3个变量都替换为2个变量,或者使用新版本cv2库的返回值。以下是两种方法的代码示例:
方法一:将3个变量都替换为2个变量
```python
import cv2
import numpy as np
import tkinter as tk
from tkinter import filedialog
class CellCounter:
def __init__(self):
self.root = tk.Tk()
self.root.title("Cell Counter")
self.root.geometry("400x300")
self.img = None
self.thresh = None
self.count = 0
self.img_label = tk.Label(self.root, text="No image selected")
self.img_label.pack(pady=10)
self.btn_select = tk.Button(self.root, text="Select Image", command=self.select_image)
self.btn_select.pack(pady=10)
self.btn_count = tk.Button(self.root, text="Count Cells", command=self.count_cells)
self.btn_count.pack(pady=10)
self.count_label = tk.Label(self.root, text="Cell Count: 0")
self.count_label.pack(pady=10)
def select_image(self):
path = filedialog.askopenfilename(filetypes=[("Image Files", "*.jpg;*.jpeg;*.png;*.bmp")])
if path:
self.img = cv2.imread(path)
self.img_label.config(text="Image: {}".format(path))
self.thresh = None
self.count = 0
self.count_label.config(text="Cell Count: 0")
def count_cells(self):
if self.img is None:
return
if self.thresh is None:
gray = cv2.cvtColor(self.img, cv2.COLOR_BGR2GRAY)
_, self.thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
contours, _ = cv2.findContours(self.thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
self.count = len(contours)
self.count_label.config(text="Cell Count: {}".format(self.count))
def run(self):
self.root.mainloop()
if __name__ == "__main__":
app = CellCounter()
app.run()
```
方法二:使用新版本cv2库的返回值
```python
import cv2
import numpy as np
import tkinter as tk
from tkinter import filedialog
class CellCounter:
def __init__(self):
self.root = tk.Tk()
self.root.title("Cell Counter")
self.root.geometry("400x300")
self.img = None
self.thresh = None
self.count = 0
self.img_label = tk.Label(self.root, text="No image selected")
self.img_label.pack(pady=10)
self.btn_select = tk.Button(self.root, text="Select Image", command=self.select_image)
self.btn_select.pack(pady=10)
self.btn_count = tk.Button(self.root, text="Count Cells", command=self.count_cells)
self.btn_count.pack(pady=10)
self.count_label = tk.Label(self.root, text="Cell Count: 0")
self.count_label.pack(pady=10)
def select_image(self):
path = filedialog.askopenfilename(filetypes=[("Image Files", "*.jpg;*.jpeg;*.png;*.bmp")])
if path:
self.img = cv2.imread(path)
self.img_label.config(text="Image: {}".format(path))
self.thresh = None
self.count = 0
self.count_label.config(text="Cell Count: 0")
def count_cells(self):
if self.img is None:
return
if self.thresh is None:
gray = cv2.cvtColor(self.img, cv2.COLOR_BGR2GRAY)
_, self.thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
_, contours = cv2.findContours(self.thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
self.count = len(contours)
self.count_label.config(text="Cell Count: {}".format(self.count))
def run(self):
self.root.mainloop()
if __name__ == "__main__":
app = CellCounter()
app.run()
```
希望这些方法可以帮助你解决报错问题!
File "D:\DAIMA\球团.py", line 14, in <module> contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) # OpenCV4~ ValueError: too many values to unpack (expected 2)
这是一段有关使用OpenCV库处理图像的代码,其中在第14行调用了OpenCV库中的findContours函数来寻找图像的轮廓(contours)和层级(hierarchy)。函数需要传入三个参数:输入的二进制图像(binary)、轮廓检索模式(cv2.RETR_TREE)和轮廓近似方法(cv2.CHAIN_APPROX_SIMPLE)。
阅读全文