python cv2 findContours函数和drawContours函数介绍

本文介绍了OpenCV库中用于寻找和绘制轮廓的findContours和drawContours函数。详细阐述了这两个函数的参数及用法,帮助理解如何在Python中利用它们来处理0-1图像并画出轮廓。

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

findContours函数和drawContours函数是画轮廓很方便的函数

首先贴两张函数参数表,这是C++上的OpenCV

接下来分别看具体用法和参数格式

1. findContours

contours, hierarchy = cv2.findContours(
            thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE
        )

函数作用是画出0-1图thresh的轮廓。两个重要参数的shape

thresh.shape                                                                                      
(911, 911, 1)

contours.shape                                                                                    
*** AttributeError: 'list' object has no attribute 'shape'                                              

len(contours)                                                                                     
5                                                                                                       

contours[0].shape                                                                                 
(2, 1, 2)                                                                                               

contours[1].shape                                                                                 
(24, 1, 2) 
                                                                                             
contours[3].shape                                                                                 
(11, 1, 2)  
                                                                                            
contours[4].shape                                                                                 
(56, 1, 2) 

2. drawContours

            rect = cv2.minAreaRect(cnt)
            box = cv2.boxPoints(rect)
            box = np.int0(box)
            cv2.drawContours(image, [box], 0, (0, 0, 255), 2)

以上语句作用是画出点集的最小外接矩形,然后把Box2D结构变成四点的numpy数组形式,最后根据四点画出轮廓

重要参数的shape如下

cnt.shape                                                                                         
(95, 1, 2)

rect                                                                                              
((768.0, 852.5), (168.0, 49.0), -0.0) 分别表示旋转矩形的中心坐标,长宽,和旋转角度

box.shape
(4, 2)

box[0]的第一个元素表示横向方向离左上角的距离,第二个元素表示纵向方向离左上角的距离

### 关于 `cv2.findContours` 查找特定颜色区域(红色) `cv2.findContours` 是 OpenCV 中用于从二值图像中提取轮廓函数。然而,该函数本身并不直接支持基于颜色的选择功能[^1]。为了使用 `cv2.findContours` 来查找图像中的红色区域,需要先对彩色图像进行预处理,将其转换为适合的颜色空间,并分离出目标颜色区域后再生成二值掩模图像。 #### 处理流程概述 以下是实现这一目标的主要步骤: 1. **读取原始图像**:加载包含所需颜色信息的 RGB 图像。 2. **转换到 HSV 颜色空间**:相比于 RGB,HSV 更加直观且易于分割颜色[^3]。 3. **设定阈值范围**:定义红色在 HSV 色彩模型中的上下限值。 4. **创建掩码**:通过应用这些阈值得到仅保留红色部分的二值化掩膜。 5. **形态学操作可选**:去除噪声或填补空洞以改善结果质量。 6. **调用 findContours**:最终将清理后的二值图送入 `cv2.findContours` 获取边界信息。 #### 实现代码示例 ```python import cv2 import numpy as np # 加载图片并转至HSV色彩模式 image = cv2.imread('example.jpg') hsv_img = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) # 定义红色区间(HSV),注意OpenCV采用的是0-180度表示法对于色调H分量 lower_red1 = np.array([0, 70, 50]) # 下半部红区低界 upper_red1 = np.array([10, 255, 255]) # 上半部红区高界 lower_red2 = np.array([170, 70, 50]) # 上半部红区低界 upper_red2 = np.array([180, 255, 255])# 上半部红区高界 mask1 = cv2.inRange(hsv_img, lower_red1, upper_red1) mask2 = cv2.inRange(hsv_img, lower_red2, upper_red2) red_mask = mask1 | mask2 # 形态学闭运算消除可能存在的小孔洞 kernel = np.ones((5,5),np.uint8) closing = cv2.morphologyEx(red_mask, cv2.MORPH_CLOSE, kernel) # 找寻轮廓 contours, hierarchy = cv2.findContours(closing.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2:] print(f"{len(contours)} red regions found.") # 绘制矩形包围框标记每一块发现的红色区域 for cnt in contours: x,y,w,h = cv2.boundingRect(cnt) cv2.rectangle(image,(x,y),(x+w,y+h),(0,255,0),2) cv2.imshow('Red Regions Detected', image) cv2.waitKey(0) cv2.destroyAllWindows() ``` 上述脚本展示了如何定位一幅标准照片里的所有红色斑块,并围绕它们上绿色边框加以强调。 --- ### 注意事项 - 不同光照条件下同一物体可能会表现出不同的RGB/HSV数值,因此建议针对具体应用场景微调颜色界限。 - 如果遇到复杂背景干扰,则考虑引入额外过滤条件比如面积筛选等手段辅助精确定位目标对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值