cv2.findContours报错
时间: 2023-07-15 12:12:04 浏览: 178
`cv2.findContours()` 函数通常在图像处理中用于查找和提取图像的轮廓。如果该函数报错,可能是以下原因之一:
1. 输入的图像不是灰度图像或二值图像。因此,需要确保输入图像是单通道的灰度图像或二值图像。
2. 输入的二值图像没有经过阈值化处理。因此,需要确保输入的二值图像已经通过阈值化处理,将像素值转换为0或255。
3. OpenCV版本问题。在旧版本的OpenCV中, `cv2.findContours()` 函数的返回值是一个元组 `(contours, hierarchy)` ,而在新版本的OpenCV中,返回值是一个列表 `contours` 。因此,需要根据OpenCV版本的不同来处理返回值。
4. 在调用 `cv2.findContours()` 函数之前,需要确保输入图像已经被正确的加载和读取。
可以根据具体的错误信息和代码进行排查和解决。
相关问题
cv2.drawContours报错error: (-215:Assertion failed) npoints > 0 in function 'drawContours'
这个错误通常是由于传递给`cv2.drawContours`的轮廓点数目为零导致的。请确保您传递给该函数的轮廓点数大于零。
可能的原因是您的轮廓列表为空,或者在计算轮廓时出现了问题。请检查您的代码,确保在调用`cv2.drawContours`之前,已经成功计算出了轮廓。您可以使用`cv2.findContours`或其他轮廓检测方法来获取轮廓。
以下是一个示例代码片段,演示如何使用`cv2.findContours`获取轮廓并绘制它们:
```python
import cv2
# 读取图像并转换为灰度图
image = cv2.imread("image.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 二值化图像
ret, threshold = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
# 查找轮廓
contours, hierarchy = cv2.findContours(threshold, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 绘制轮廓
cv2.drawContours(image, contours, -1, (0, 255, 0), 3)
# 显示结果
cv2.imshow("Contours", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
请注意,这只是一个示例,您需要根据您的实际需求进行适当的修改。如果问题仍然存在,请检查您的图像处理流程,确保正确地计算了轮廓。
报错如何解决,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()
```
希望这些方法可以帮助你解决报错问题!
阅读全文