opencv实现图形轮廓检测

yizhihongxing

OpenCV实现图形轮廓检测

轮廓在计算机视觉和图像处理中扮演着重要的角色,特别是在图形识别和物体检测方面。OpenCV是一个强大的计算机视觉库,在模式识别和图像处理领域非常受欢迎。在本文中,我们将讨论如何使用OpenCV库实现图形轮廓检测。

1. 安装OpenCV

在开始之前,我们需要安装OpenCV库。OpenCV支持多种编程语言,如Python、C++、Matlab等。我们将在Python中使用OpenCV库进行图形轮廓检测。在安装OpenCV之前,你需要在你的计算机上安装Python。

在安装OpenCV之前,我们需要安装Python的一些包,如numpy和matplotlib,这些包可以帮助我们更好地处理图像和数据。

pip install numpy matplotlib opencv-python

2. 加载图像

在OpenCV中,我们可以使用imread()函数从图像文件中读取图像。我们需要将图像转换为灰度图像,因为在灰度图像中轮廓更容易检测。

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 加载图像
img = cv2.imread('test.png')

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

# 显示原图和灰度图像
plt.subplot(121), plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)), plt.title('Original')
plt.subplot(122), plt.imshow(gray, cmap='gray'), plt.title('Gray')
plt.show()

3. 轮廓检测

在OpenCV中,我们可以使用findContours()函数查找图像的轮廓。此函数具有三个参数:

  • 输入图像,要求图像为8位单通道图像,如灰度图像。
  • 轮廓检测模式,表示如何查找轮廓,包括轮廓树、简单轮廓、中心轮廓等。
  • 轮廓逼近方法,确定轮廓的精度。我们可以选择使用点到轮廓的最大距离或使用Ramer-Douglas-Peucker算法。
# 轮廓检测
contours, hierarchy = cv2.findContours(gray, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

# 画出轮廓
img_contour = np.zeros(gray.shape)
cv2.drawContours(img_contour, contours, -1, (255, 255, 255), 3)

# 显示轮廓检测结果
plt.imshow(img_contour, cmap='gray')
plt.show()

示例1

现在让我们使用真实的图像进行轮廓检测。在此示例中,我们将使用包含多个图形的图像进行轮廓检测。

# 加载图像
img = cv2.imread('shapes.png')

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

# 轮廓检测
contours, hierarchy = cv2.findContours(gray, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

# 画出轮廓
img_contour = np.zeros(gray.shape)
cv2.drawContours(img_contour, contours, -1, (255, 255, 255), 3)

# 显示轮廓检测结果
plt.imshow(img_contour, cmap='gray')
plt.show()

opencv实现图形轮廓检测

示例2

在此示例中,我们将使用一个更复杂的图像进行轮廓检测。这个图像有多个轮廓,我们将对每个轮廓进行不同的操作。

# 加载图像
img = cv2.imread('shapes2.png')

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

# 轮廓检测
contours, hierarchy = cv2.findContours(gray, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

# 对每个轮廓进行操作
for i in range(len(contours)):
    # 计算轮廓长度
    perimeter = cv2.arcLength(contours[i], True)
    print("Perimeter of contour {}: {}".format(i, perimeter))

    # 计算轮廓面积
    area = cv2.contourArea(contours[i])
    print("Area of contour {}: {}".format(i, area))

    # 绘制包含当前轮廓的最小矩形
    rect = cv2.minAreaRect(contours[i])
    box = cv2.boxPoints(rect)
    box = np.int0(box)
    cv2.drawContours(img, [box], 0, (0, 0, 255), 2)

    # 绘制包含当前轮廓的最小圆形
    (x, y), radius = cv2.minEnclosingCircle(contours[i])
    center = (int(x), int(y))
    radius = int(radius)
    img = cv2.circle(img, center, radius, (0, 255, 0), 2)

# 显示轮廓检测结果
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.show()

opencv实现图形轮廓检测

以上就是使用OpenCV库实现图形轮廓检测的详细攻略,希望对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:opencv实现图形轮廓检测 - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • Windous7任务栏变白色且Aero主题显示不出来的解决方法

    下面我将针对“Windows 7任务栏变白色且Aero主题显示不出来”这一问题提供完整的解决方法。解决方法如下: 1. 检查是否启用了Aero主题 在开始解决问题之前,先要确认是否启用了Aero主题。因为Aero主题是Windows 7的一个重要特性,如果关闭了Aero主题,会导致任务栏变白色且Aero主题无法显示。方法如下: 右键单击桌面空白处,选择“个性…

    other 2023年6月27日
    00
  • vue页面加载完成再执行的方法

    Vue页面加载完成再执行的方法 在 Vue 应用中,我们有时需要在页面加载完成后再执行某些操作,比如获取数据、执行动画等等。Vue 提供了一些生命周期钩子函数来帮助我们实现这些需求,本篇文章将介绍如何在 Vue 页面加载完成后执行方法。 mounted 钩子函数 mounted 钩子函数是在组件挂载完成后调用的钩子函数,此时组件已经渲染到了页面上并且 DOM…

    其他 2023年3月28日
    00
  • Android自定义悬浮按钮效果

    Android自定义悬浮按钮效果 在手机应用开发中,悬浮按钮已经成为了流行的用户界面元素。悬浮按钮可以通过相应的手势实现一些应用操作,比如向上滑动打开应用菜单、向下滑动隐藏悬浮按钮等等。本文将介绍如何使用Android SDK来自定义悬浮按钮效果。 步骤1:创建悬浮按钮控件 为了实现悬浮按钮的效果,需要创建自定义的View控件。下面是一个简单的悬浮按钮控件代…

    other 2023年6月25日
    00
  • 有道词典怎么添加到鼠标右键菜单 有道词典添加到鼠标右键菜单教程

    有道词典添加到鼠标右键菜单教程 在日常工作和学习中,我们常需要查阅词典来理解某些生词和专业术语,而有道词典就是一款功能强大、易于使用的在线词典软件。为了更加方便地使用有道词典,我们可以将其添加到鼠标右键菜单里,这样在需要时只需鼠标右键一下即可进行查询。 以下是如何将有道词典添加到鼠标右键菜单的具体方法: Step 1:下载并安装 前往有道词典官网,下载并安装…

    other 2023年6月27日
    00
  • Android数据双向绑定原理实现和应用场景

    Android数据双向绑定原理实现和应用场景攻略 1. 什么是Android数据双向绑定 Android数据双向绑定是一种机制,它允许数据模型和用户界面之间的自动同步。当数据模型发生变化时,界面会自动更新;反之,当用户在界面上进行操作时,数据模型也会相应地更新。 2. 实现Android数据双向绑定的原理 实现Android数据双向绑定的原理主要涉及以下几个…

    other 2023年9月6日
    00
  • Sql 批量查看字符所在的表及字段

    SQL 批量查看字符所在的表及字段,涉及到字符所在的表及字段的查找,我们可以通过如下的步骤来实现: 使用information_schema系统表查询字符所在的表及字段名 构造动态 SQL 语句,实现具体功能 下面具体讲解如何通过以上步骤来实现 SQL 批量查看字符所在的表及字段的功能。 步骤1:使用information_schema系统表查询字符所在的表…

    other 2023年6月25日
    00
  • Java编译和解释执行对比及原理解析

    Java编译和解释执行对比及原理解析 Java是一种编程语言,它支持编译和解释执行两种方式。本文将对Java编译和解释执行进行对比,并探讨它们的原理。 Java编译原理 Java编译器将Java源代码编译成字节码,这些字节码可以运行在Java虚拟机上。Java代码编译成字节码的过程分为以下几个步骤: 词法分析:将源代码分解成一个个的单词和符号。 语法分析:将…

    other 2023年6月26日
    00
  • Mac笔记本怎么查看IP地址网关DNS?

    当你使用Mac笔记本时,可以通过以下步骤查看IP地址、网关和DNS信息: 打开“系统偏好设置”:点击屏幕左上角的苹果图标,然后选择“系统偏好设置”。 进入“网络”设置:在系统偏好设置窗口中,点击“网络”图标。 选择网络连接:在左侧的网络连接列表中,选择你正在使用的网络连接,比如Wi-Fi或以太网。 查看IP地址:在右侧的信息窗口中,你将看到一个标签为“IP地…

    other 2023年7月30日
    00
合作推广
合作推广
分享本页
返回顶部