首页 > 其他分享 >opencv学习:图像轮廓识别及代码实现

opencv学习:图像轮廓识别及代码实现

时间:2024-09-09 20:25:31浏览次数:13  
标签:phone cv2 opencv contours 图像 轮廓 绘制

图像轮廓

1.获取图像轮廓

cv2.findContours() 函数是 OpenCV 库中用于检测图像中轮廓的函数。它可以检测到图像中所有连通区域的边界,并返回这些轮廓的列表。从 OpenCV 3.4 版本开始,这个函数的返回值和参数有所变化,以下是详细的参数说明:

方法:

contours, hierarchy = cv2.findContours( img, mode, method )

参数说明

  1. img:输入图像,必须是二值图像。图像中的轮廓将基于此图像进行检测。

  2. mode:轮廓检索模式,用于指定要检索哪些轮廓。可用的模式有:

    • cv2.RETR_EXTERNAL:只检索最外层的轮廓。
    • cv2.RETR_LIST:检索所有轮廓,但不建立任何父子关系。
    • cv2.RETR_CCOMP:检索所有轮廓,并将它们组织成两级层次结构。
    • cv2.RETR_TREE:检索所有轮廓,并重建完整的层次结构。
  3. method:轮廓近似方法,用于指定如何存储轮廓点。可用的方法有:

    • cv2.CHAIN_APPROX_NONE:存储所有轮廓点。
    • cv2.CHAIN_APPROX_SIMPLE:只存储轮廓的拐点,这可以减少轮廓点的数量。

返回值

  • contours:这是一个 Python 列表,其中包含了检测到的轮廓。每个轮廓都是一个形状为 (n, 1, 2) 的 numpy 数组,其中 n 是轮廓点的数量。
  • hierarchy:这是一个 numpy 数组,包含了轮廓的层次信息。层次信息可以用来了解轮廓之间的父子关系。

2.绘制图像轮廓

        在OpenCV中,cv2.drawContours()函数用于在图像上绘制轮廓。这个函数非常强大,因为它允许你指定轮廓的颜色、线条粗细以及其他参数。下面是这个函数的详细参数说明:

方法:

cv2.drawContours(img, contours, contourIdx, color, thickness, lineType=None, hierarchy=None)

参数说明

  1. img:目标图像,即你要在其上绘制轮廓的图像。这个图像应该是一个可以修改的图像数组。

  2. contours:这是一个轮廓列表。轮廓可以是OpenCV中找到的任何轮廓,通常是一个形状为(N, 1, 2)的numpy数组,其中N是轮廓中的点数。

  3. contourIdx:指定要绘制的轮廓的索引。如果传递的是-1,则绘制所有轮廓。

  4. color:轮廓线的颜色。这应该是一个具有三个元素的元组,表示BGR颜色(例如,红色为(0, 0, 255))。

  5. thickness:线条的粗细。如果设置为正数,则线条的粗细为指定的像素数;如果设置为cv2.FILLED-1,则轮廓将被填充。

  6. lineType(可选):线条的类型。默认是cv2.LINE_8,表示8连通性线。其他选项包括cv2.LINE_4(4连通性线)和cv2.LINE_AA(抗锯齿线)。

  7. hierarchy(可选):轮廓的层次结构。这是一个与contours数组相对应的数组,其中包含每个轮廓的层次信息。如果提供,可以用来绘制轮廓的父子关系。

实验代码

1.获取图像

import cv2

# 读取图像
phone = cv2.imread('cat.png')  # 读取名为'cat.png'的图像

# 将图像转换为灰度图像
phone_gray = cv2.cvtColor(phone, cv2.COLOR_BGR2GRAY)  # 将彩色图像转换为灰度图

# 应用阈值操作以创建二值图像
ret, phone_binary = cv2.threshold(phone_gray, 120, 255, cv2.THRESH_BINARY)  # 使用阈值120将灰度图转换为二值图
# cv2.imshow('1',phone_binary)  # 显示二值图像

2.查找轮廓

# 查找轮廓
_, contours, hierarchy = cv2.findContours(phone_binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)  # 在二值图中查找轮廓
# 打印轮廓数量和层次结构信息
print(hierarchy)  # 打印轮廓的层次结构信息
print(len(contours))  # 打印轮廓的数量

3.复制图像用于绘制轮廓

# 复制图像用于绘制轮廓
image_copy = phone.copy()
image_copy = cv2.drawContours(image=image_copy, contours=contours, contourIdx=-1, color=(0, 255, 0), thickness=3)  # 在图像上绘制所有轮廓
# cv2.imshow('contours',image_copy)  # 显示绘制了轮廓的图像
cv2.waitKey(0)  # 等待按键

4.计算轮廓面积和周长

# 计算第一个和第二个轮廓的面积
area_0 = cv2.contourArea(contours[0])
area_1 = cv2.contourArea(contours[1])
print(area_0, area_1)  # 打印面积

# 计算第一个轮廓的周长
length = cv2.arcLength(contours[0], closed=True)
print(length)  # 打印周长

5.查找轮廓

# 筛选面积大于10000的轮廓
a_list = []
for i in range(len(contours)):
    if cv2.contourArea(contours[i]) > 10000:
        a_list.append(contours[i])

# 找到第七个轮廓的最小包围圆
cnt = contours[6]
(x, y), r = cv2.minEnclosingCircle(cnt)
phone_circle = cv2.circle(phone, (int(x), int(y)), int(r), (0, 255, 0), 2)  # 在图像上绘制最小包围圆
cv2.imshow('phone_circle', phone_circle)  # 显示绘制了最小包围圆的图像

# 找到第七个轮廓的最小包围矩形
x, y, w, h = cv2.boundingRect((cnt))
phone_rectangle = cv2.rectangle(phone, (x, y), (x + w, y + h), (0, 255, 0), 2)  # 在图像上绘制最小包围矩形
cv2.imshow('phone_rectangle', phone_rectangle)  # 显示绘制了最小包围矩形的图像

6.轮廓近似

# 重新查找轮廓
image, contours, hierarchy = cv2.findContours(phone_binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)

# 对最后一个轮廓进行轮廓近似
epsilon = 0.001 * cv2.arcLength(contours[-1], True)
approx = cv2.approxPolyDP(contours[-1], epsilon, True)
phone_new = phone.copy()
image_contours = cv2.drawContours(phone_new, [approx], contourIdx=-1, color=(0, 255, 0), thickness=3)  # 在图像上绘制近似轮廓
cv2.imshow('image_contours', image_contours)  # 显示绘制了近似轮廓的图像

cv2.waitKey(0)

实验分析

  • 通过阈值操作,图像中的轮廓被清晰地分离出来,这为后续的轮廓处理提供了便利。
  • 轮廓的面积和周长的计算对于理解图像中对象的大小和形状特征非常重要。
  • 最小包围圆和最小包围矩形的绘制有助于识别和定位图像中的主要对象。
  • 轮廓近似可以简化轮廓的形状,减少计算复杂度,同时保留轮廓的主要特征。

结论

        本实验通过使用OpenCV库成功地完成了图像处理的各个步骤,包括图像的读取、转换、阈值操作、轮廓查找、面积和周长计算、最小包围圆和矩形的绘制以及轮廓近似。这些技术在图像识别、对象检测和图像分析等领域有着广泛的应用。

标签:phone,cv2,opencv,contours,图像,轮廓,绘制
From: https://blog.csdn.net/mohanyelong/article/details/142067951

相关文章

  • 基于ARM芯片与OpenCV的工业分拣机器人项目设计与实现流程详解
    一、项目概述项目目标和用途本项目旨在设计和实现一套工业分拣机器人系统,能够高效、准确地对不同类型的物品进行自动分拣。该系统广泛应用于物流、仓储和制造业,能够显著提高工作效率,降低人工成本。技术栈关键词ARM芯片步进电机控制OpenCV图像识别无线通信模块......
  • OpenGL ES使用正交投影来解决图像变形的问题
    一、概述上一节实践了,通过改变GLSurfaceView的宽高来解决图像变形的问题。本节将通过正交投影的方式解决图像变形的问题。分三步:1.计算屏幕的宽高比及图像的宽高比varscreenRatio=screenWidth.toFloat()/screenHeightvarimgRat......
  • OpenCV(cv::Mat::setTo())
    目录1.函数定义2.示例3.使用场景4.性能5.注意事项cv::Mat::setTo()是OpenCV中用于将矩阵中的所有元素设置为一个给定的值。它可以应用于整个矩阵,也可以通过掩码(mask)仅对部分矩阵进行操作。这个函数常用于图像处理中的多种场景,例如图像填充、区域修改等。1.函数定......
  • LivePortrait: 让静态图像“活”起来、更好地控制图片/视频中人物的表情,新增动物模式,
     引言随着AI技术的飞速发展,图像生成与编辑的门槛不断降低,尤其在人像视频生成领域取得了令人瞩目的成就。快手可灵大模型团队开源的LivePortrait框架,以其出色的性能与创新的设计,引领了AI生成的新浪潮。LivePortrait不仅能够将静态图像转换为动态视频,还能精确控制面......
  • PhotoZoom Pro 9真的可以图像无损放大可能吗?
     PhotoZoomPro9是一款非常精悍的图片无损放大,且放大不失真的图片处理软件。它是一款采用国际领先插值算法的新颖的、技术上具有革命性的对数码图片无损放大的工具。PhotoZoomPro9全新版本震撼来袭无损放大照片,无与伦比的画质效果。强大易用的软件界面, 清晰小图......
  • 《机器学习》—— SVD奇异值分解方法对图像进行压缩
    文章目录一、SVD奇异值分解简单介绍二、代码实现—SVD奇异值分解方法对图像进行压缩一、SVD奇异值分解简单介绍SVD(奇异值分解)是一种在信号处理、统计学、线性代数、机器学习等多个领域广泛应用的矩阵分解方法。它将任何m×n矩阵A分解为三个特定矩阵的乘积:其中......
  • ComfyUI 基础教程(四) —— 应用 LoRA 模型控制图像生成特征
    前言上一篇文章讲述了ControlNet模型的使用,如果掌握了ControlNet的使用之后,本文所讲的Lora模型将会非常容易理解。一、LoRA模型的概念之前的文章中,在介绍模型种类时,简单介绍过Lora模型,LoRA模型全称是Low-Rank-AdaptaionofLargeLanguageModels。是一种用于微调......
  • Adobe Photoshop PS 2024 下载安装及常用快捷键 (图像处理软件)
    目录一、软件简介1.1产品概述1.2功能特色1.3应用领域二、安装步骤2.1准备工作下载软件:2.2安装过程三、常用快捷键3.1基础编辑快捷键3.2图像选择与裁剪3.3图层与蒙版快捷键一、软件简介1.1产品概述AdobePhotoshop(简称PS)是由AdobeSystems开发和发行......
  • 基于yolov10的行人跌倒检测系统,支持图像检测,也支持视频和摄像实时检测(pytorch框架)【py
       更多目标检测和图像分类识别项目可看我主页其他文章功能演示:基于yolov10的行人跌倒检测系统,支持图像、视频和摄像实时检测【pytorch框架、python】_哔哩哔哩_bilibili(一)简介基于yolov10的行人跌倒检测系统是在pytorch框架下实现的,这是一个完整的项目,包括代码,数据集,训......
  • 优爱酷爱图图像管理系统是专业的批量图像处理工具,支持无缝拼接、全景图像融合、滚动长
    优爱酷爱图图像管理系统是专业的批量图像处理工具,支持无缝拼接、全景图像融合、滚动长截图、自动拖拽截图、AI智能扩图、照片图像裁剪、纠偏漂白、证照换色、去水印、底片翻新、黑白上色,黑白彩色漂白等 >>视频介绍:http://cloud.video.taobao.com/play/u/null/p/1/e/6/t/......