OpenCV 4.1.0版drawContours

OpenCV 是一个非常强大的图像处理库,它的 `cv2.drawContours` 方法可以用来在图像上绘制轮廓。以下是一些基本的步骤和一些代码示例:

### 基本步骤:

1. **导入OpenCV**:
   ```python
   import cv2
   ```

2. **读取图片**:
   ```python
   img = cv2.imread('input.jpg')  # 读取一张图片,路径为'input.jpg'
   ```

3. **获取图片的轮廓**:
   - 首先,需要创建一个空的轮廓数组,然后使用 `findContours` 方法找到图片中的轮廓。
     ```python
     contours, _ = cv2.findContours(cv2.cvtColor(img, cv2.COLOR_BGR2GRAY), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)  # 获取所有轮廓
     ```

4. **绘制轮廓**:
   - 使用 `cv2.drawContours` 方法在图片上画出轮廓。
     ```python
     # 在原图上绘制所有轮廓,参数包括:图像、轮廓列表、-1表示所有轮廓、颜色(BGR格式)和线条厚度
     cv2.drawContours(img, contours, -1, (0, 255, 0), 3)
     ```

5. **显示或保存结果**:
   - 最后,可以显示修改后的图片或者保存为新的文件。
     ```python
     cv2.imshow('Contours', img)  # 在窗口中显示修改后的图片
     cv2.waitKey(0)  # 等待用户按键
     cv2.destroyAllWindows()  # 关闭所有打开的窗口

     # 或者保存为新的文件
     cv2.imwrite('output.jpg', img)
     ```

### 代码示例:

```python
import cv2

def draw_contours(image_path):
    # 读取图片
    img = cv2.imread(image_path)

    # 将图像转换为灰度图
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    # 获取轮廓
    contours, _ = cv2.findContours(gray, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

    # 在原图上绘制轮廓
    cv2.drawContours(img, contours, -1, (0, 255, 0), 3)  # 绿色线条,厚度为3

    # 显示或保存结果
    cv2.imshow('Contours', img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

if __name__ == "__main__":
    draw_contours('input.jpg')
```

### 测试用例:

假设我们有一个名为 `test_image.jpg` 的图片,该图片包含了多个形状的轮廓。运行上述代码,将会在窗口中显示原始图像和带有轮廓的新图像。

### 人工智能大模型应用:

- **物体检测**:在OpenCV中,我们可以使用 `cv2.findContours` 和 `cv2.approxPolyDP` 等函数结合机器学习算法(例如SVM或神经网络)来进行物体检测。例如,我们可以训练一个分类器来识别特定的形状(如圆形、矩形等)。

- **图像分割**:在图像分割中,OpenCV提供了多种方法,包括基于轮廓的分割。通过找到图像中的连通区域并使用 `cv2.approxPolyDP` 逼近每个区域的轮廓,我们可以将图片分割成多个具有特定形状的区域。

例如,一个简单的图像分割示例如下:

```python
import cv2

def split_image(image_path):
    # 读取图片
    img = cv2.imread(image_path)

    # 将图像转换为灰度图
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    # 获取轮廓
    contours, _ = cv2.findContours(gray, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

    for contour in contours:
        # 使用cv2.approxPolyDP逼近每个轮廓
        epsilon = 0.01*cv2.arcLength(contour,True)
        approx = cv2.approxPolyDP(contour,epsilon,True)

        # 如果近似轮廓有4个顶点(可能是矩形),则将其分割为新区域
        if len(approx) == 4:
            x, y, w, h = cv2.boundingRect(approx)
            roi = img[y:y+h, x:x+w]  # 获取矩形区域
            cv2.imshow('ROI', roi)
            cv2.waitKey(0)

if __name__ == "__main__":
    split_image('test_image.jpg')
```

这个示例中,我们只处理了近似轮廓长度为4(即可能为矩形的轮廓)的图像区域。python

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

潮易

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值