opencv轮廓(opencv轮廓提取坐标点)
## OpenCV 轮廓详解### 简介在计算机视觉中,物体识别是一个重要课题,而识别物体的基础往往是提取其轮廓信息。OpenCV 作为一个强大的计算机视觉库,提供了丰富的轮廓处理函数,可以帮助我们高效地完成轮廓提取、分析和应用等任务。### 一、轮廓提取#### 1.1 查找轮廓:`cv2.findContours()``cv2.findContours()` 函数用于在二值图像中查找轮廓。其语法如下:```python contours, hierarchy = cv2.findContours(image, mode, method) ```- `image`: 输入图像,必须是 8 位单通道图像。 - `mode`: 轮廓检索模式,常见的有:- `cv2.RETR_EXTERNAL`: 只检索最外层轮廓。- `cv2.RETR_LIST`: 检索所有轮廓,但不建立层次结构。- `cv2.RETR_TREE`: 检索所有轮廓,并建立完整的层次结构。 - `method`: 轮廓近似方法,常见的有:- `cv2.CHAIN_APPROX_NONE`: 存储所有轮廓点。- `cv2.CHAIN_APPROX_SIMPLE`: 仅存储轮廓的端点,压缩数据。- 返回值:- `contours`: 找到的轮廓列表,每个轮廓都是一个 NumPy 数组,包含轮廓点的坐标。- `hierarchy`: 轮廓的层次结构,是一个 NumPy 数组,用于描述轮廓之间的父子关系。#### 1.2 示例```python import cv2# 读取图像 img = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)# 二值化 ret, thresh = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)# 查找轮廓 contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)# 绘制轮廓 cv2.drawContours(img, contours, -1, (0,255,0), 3)# 显示结果 cv2.imshow("Contours", img) cv2.waitKey(0) cv2.destroyAllWindows() ```### 二、轮廓特征分析#### 2.1 面积:`cv2.contourArea()````python area = cv2.contourArea(contour) ```- `contour`: 输入轮廓。 - 返回值:轮廓的面积。#### 2.2 周长:`cv2.arcLength()````python perimeter = cv2.arcLength(contour, closed) ```- `contour`: 输入轮廓。 - `closed`: 是否为闭合轮廓。 - 返回值:轮廓的周长。#### 2.3 边界矩形:`cv2.boundingRect()````python x, y, w, h = cv2.boundingRect(contour) ```- `contour`: 输入轮廓。 - 返回值:边界矩形的 x 坐标、y 坐标、宽度和高度。#### 2.4 最小外接矩形:`cv2.minAreaRect()````python rect = cv2.minAreaRect(contour) ```- `contour`: 输入轮廓。 - 返回值:一个 `RotatedRect` 对象,包含最小外接矩形的中心点坐标、尺寸和旋转角度。#### 2.5 最小外接圆:`cv2.minEnclosingCircle()````python (x,y),radius = cv2.minEnclosingCircle(contour) ```- `contour`: 输入轮廓。 - 返回值:最小外接圆的圆心坐标和半径。### 三、轮廓应用#### 3.1 形状匹配:`cv2.matchShapes()``cv2.matchShapes()` 函数可以比较两个轮廓的相似度,返回值越小,相似度越高。```python ret = cv2.matchShapes(contour1, contour2, method, parameter) ```- `contour1`: 第一个轮廓。 - `contour2`: 第二个轮廓。 - `method`: 形状匹配方法。 - `parameter`: 方法相关的参数。#### 3.2 凸包检测:`cv2.convexHull()````python hull = cv2.convexHull(contour) ```- `contour`: 输入轮廓。 - 返回值:轮廓的凸包。### 四、总结OpenCV 提供了丰富的轮廓处理函数,可以帮助我们轻松地提取、分析和应用轮廓信息。熟练掌握这些函数,可以为我们解决很多计算机视觉问题提供强大的工具。
OpenCV 轮廓详解
简介在计算机视觉中,物体识别是一个重要课题,而识别物体的基础往往是提取其轮廓信息。OpenCV 作为一个强大的计算机视觉库,提供了丰富的轮廓处理函数,可以帮助我们高效地完成轮廓提取、分析和应用等任务。
一、轮廓提取
1.1 查找轮廓:`cv2.findContours()``cv2.findContours()` 函数用于在二值图像中查找轮廓。其语法如下:```python contours, hierarchy = cv2.findContours(image, mode, method) ```- `image`: 输入图像,必须是 8 位单通道图像。 - `mode`: 轮廓检索模式,常见的有:- `cv2.RETR_EXTERNAL`: 只检索最外层轮廓。- `cv2.RETR_LIST`: 检索所有轮廓,但不建立层次结构。- `cv2.RETR_TREE`: 检索所有轮廓,并建立完整的层次结构。 - `method`: 轮廓近似方法,常见的有:- `cv2.CHAIN_APPROX_NONE`: 存储所有轮廓点。- `cv2.CHAIN_APPROX_SIMPLE`: 仅存储轮廓的端点,压缩数据。- 返回值:- `contours`: 找到的轮廓列表,每个轮廓都是一个 NumPy 数组,包含轮廓点的坐标。- `hierarchy`: 轮廓的层次结构,是一个 NumPy 数组,用于描述轮廓之间的父子关系。
1.2 示例```python import cv2
读取图像 img = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)
二值化 ret, thresh = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
查找轮廓 contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
绘制轮廓 cv2.drawContours(img, contours, -1, (0,255,0), 3)
显示结果 cv2.imshow("Contours", img) cv2.waitKey(0) cv2.destroyAllWindows() ```
二、轮廓特征分析
2.1 面积:`cv2.contourArea()````python area = cv2.contourArea(contour) ```- `contour`: 输入轮廓。 - 返回值:轮廓的面积。
2.2 周长:`cv2.arcLength()````python perimeter = cv2.arcLength(contour, closed) ```- `contour`: 输入轮廓。 - `closed`: 是否为闭合轮廓。 - 返回值:轮廓的周长。
2.3 边界矩形:`cv2.boundingRect()````python x, y, w, h = cv2.boundingRect(contour) ```- `contour`: 输入轮廓。 - 返回值:边界矩形的 x 坐标、y 坐标、宽度和高度。
2.4 最小外接矩形:`cv2.minAreaRect()````python rect = cv2.minAreaRect(contour) ```- `contour`: 输入轮廓。 - 返回值:一个 `RotatedRect` 对象,包含最小外接矩形的中心点坐标、尺寸和旋转角度。
2.5 最小外接圆:`cv2.minEnclosingCircle()````python (x,y),radius = cv2.minEnclosingCircle(contour) ```- `contour`: 输入轮廓。 - 返回值:最小外接圆的圆心坐标和半径。
三、轮廓应用
3.1 形状匹配:`cv2.matchShapes()``cv2.matchShapes()` 函数可以比较两个轮廓的相似度,返回值越小,相似度越高。```python ret = cv2.matchShapes(contour1, contour2, method, parameter) ```- `contour1`: 第一个轮廓。 - `contour2`: 第二个轮廓。 - `method`: 形状匹配方法。 - `parameter`: 方法相关的参数。
3.2 凸包检测:`cv2.convexHull()````python hull = cv2.convexHull(contour) ```- `contour`: 输入轮廓。 - 返回值:轮廓的凸包。
四、总结OpenCV 提供了丰富的轮廓处理函数,可以帮助我们轻松地提取、分析和应用轮廓信息。熟练掌握这些函数,可以为我们解决很多计算机视觉问题提供强大的工具。