python中opencv报错,findContours()只能用灰度图

该博客主要介绍了如何使用OpenCV进行图像处理,包括读取图像、灰度化、二值化以及寻找和绘制图像的轮廓。在原程序中,由于使用了彩色图像作为参数调用findContours函数导致错误,修正后的代码正确地将二值化图像作为输入,成功找出并显示了图像的轮廓。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原程序

import cv2
import numpy as np


def cv_show(name, img):
    cv2.imshow(name, img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()


# 读取图像
img = cv2.imread('contours.png')
cv_show('contours', img)

# 灰度化和二值化
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)[1]
cv_show('thresh', thresh)

# 寻找轮廓
cnt = cv2.findContours(img, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)[1]

# 画出轮廓
draw = img.copy()
res = cv2.drawContours(draw, cnt, -1, (0, 0, 255), 2)
cv_show('res', res)

报错

Traceback (most recent call last):
  File "C:/Users/ccccj/PycharmProjects/a_opencv/opencv/opencv_notebook/课件/第2-8节课件/第2-7节notebook课件/图像操作/contours.py", line 21, in <module>
    cnt = cv2.findContours(img, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)[1]
cv2.error: OpenCV(3.4.11) C:\Users\appveyor\AppData\Local\Temp\1\pip-req-build-7_3trius\opencv\modules\imgproc\src\contours.cpp:197: error: (-210:Unsupported format or combination of formats) [Start]FindContours supports only CV_8UC1 images when mode != CV_RETR_FLOODFILL otherwise supports CV_32SC1 images only in function 'cvStartFindContours_Impl'

原因:findContours()函数的src必须为灰度图,原程序使用的是img,改为如下结果

# 寻找轮廓
# cnt = cv2.findContours(img, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)[1]


# 改为
cnt = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)[1]

<think>好的,用户想用OpenCVfindContours函数来获取图像中数字图案的轮廓。首先,我需要回顾一下findContours的使用方法。记得这个函数通常需要二值图像作为输入,所以用户可能需要先对图像进行预处理,比如灰度转换、二值化等步骤。 接下来,用户可能需要示例代码。我应该分步骤来写:读取图像,转灰度,二值化,然后找轮廓。要注意的是,OpenCV的不同版本中findContours的参数可能有变化,比如返回的轮廓结构或者层次结构。用户可能使用的是OpenCV 4.x,所以应该用RETR_EXTERNAL或者RETR_TREE等参数,以及CHAIN_APPROX_SIMPLE方法。 另外,预处理部分可能需要调整阈值方法,比如使用自适应阈值或者Otsu&#39;s二值化,特别是如果图像光照不均匀的话。在示例代码中,用cv2.threshold的THRESH_BINARY_INV是因为findContours寻找的是白色区域的轮廓,而数字通常是深色的,所以需要反转。 然后,绘制轮廓的时候,用户可能需要知道如何可视化结果,用cv2.drawContours函数,并指定颜色和线条粗细。同时,应该提醒用户注意输入图像必须是8位单通道二值图像,否则会报错。 用户可能遇到的问题包括轮廓检测不准确,这时候需要检查预处理步骤,比如是否二值化得当,或者是否有噪声干扰。可能需要建议使用滤波或者形态学操作来改善结果。此外,轮廓的筛选也是重要的,比如根据面积或长宽比去除不符合的轮廓。 最后,生成相关问题的时候,应该围绕常见的后续步骤和问题,比如如何处理多个轮廓、调整参数、优化轮廓检测,以及提取轮廓后的应用,比如裁剪区域或计算特征。需要确保问题覆盖用户可能遇到的下一步挑战,帮助他们进一步处理和分析数字图案。</think>以下是使用OpenCV的`findContours`函数提取数字图案轮廓的步骤和示例代码: --- ### 实现步骤 1. **图像预处理** - 转换为灰度图:$I_{gray} = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)$ - 二值化处理:$T_{binary} = cv2.threshold(I_{gray}, 127, 255, cv2.THRESH_BINARY\_INV)$[^1] 2. **轮廓检测** 使用`cv2.findContours`提取二值图像中所有轮廓: ```python contours, hierarchy = cv2.findContours(binary_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) ``` 3. **轮廓筛选与绘制** 根据面积或几何特征过滤无效轮廓,并绘制结果: ```python for cnt in contours: if cv2.contourArea(cnt) > 50: # 过滤小面积噪声 cv2.drawContours(img, [cnt], -1, (0,255,0), 2) ``` --- ### 完整示例代码 ```python import cv2 # 读取图像并预处理 img = cv2.imread(&#39;digits.png&#39;) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) _, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV) # 提取轮廓 contours, hierarchy = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 绘制有效轮廓 result = img.copy() for cnt in contours: if cv2.contourArea(cnt) > 50: cv2.drawContours(result, [cnt], -1, (0, 255, 0), 2) # 显示结果 cv2.imshow(&#39;Contours&#39;, result) cv2.waitKey(0) cv2.destroyAllWindows() ``` --- ### 关键参数说明 1. `cv2.RETR_EXTERNAL`:仅检测最外层轮廓 2. `cv2.CHAIN_APPROX_SIMPLE`:压缩水平/垂直/对角线方向的冗余点 3. `THRESH_BINARY_INV`:因数字通常为深色,需反转二值化 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值