当前位置: 首页 > article >正文

OpenCV-35 查找轮廓

一、 什么是图像轮廓

图像轮廓是具有相同颜色或灰度的连续点的曲线,轮廓在形状分析和物体的检测识别中很有用。

  • 用于图形分析
  • 物体的识别和检测

注意点:

  • 为了检测的准确性,需要先对图像进行二值化或Canny操作。
  • 画轮廓时会修改输入的图像,如果之后想继续使用原始图像,应该将原始图像储存到其他变量中。(即画轮廓是在原图上进行修改

二、 查找轮廓

通过使用API --- findContours(img, mode, method[, contours[, hierarchy[, offset]]]])

  • mode 查找轮廓的模式
  • 其中RETR_EXTERNAL = 0,表示只检测外围轮廓

  • RETR_LIST = 1 , 检测的轮廓不建立等级关系,即检测所有轮廓,较为常用。

  •  RETR_CCOMP = 2,每层最多两级,从小到大,从里到外。

  • RETR_TREE = 3, 按照树型存储轮廓,从小到大,从左到右 (最常用)

method :轮廓近似方法,也叫ApproximationMode

  • 其中:CHAIN_APPROX_NONE 保存所有轮廓上的点
  • CHAIN_APPROX_SIMPLE,只保存角点,比如四边形,只保留四边形的4个角,存储信息少,比较常用。

返回值 contours和hierachy是轮廓层级

其中轮廓的类型为元组(旧版本为列表)

层级的类型为np的ndarray形式

示例代码如下:

import cv2
import numpy as np
# 导入图片
img = cv2.imread("black.png")
# 变为单通道的黑白照片
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 二值化操作  ---  返回两个值:阈值和结果
ret, new_img = cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY)
# 查找轮廓
contours, hierarchy = cv2.findContours(new_img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# 打印轮廓
print(type(contours))
print(type(hierarchy))
print(contours)
print(hierarchy)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果如下:

三、 绘制轮廓

通过API --- drawContours(image, contours, contourldx[, thickness[,lineTupe[, hierachy[, maxlevel[,offset]]]])

  • image:要绘制的图象
  • conyours: 轮廓点
  • contourldx:要绘制的轮廓的编号。-1表示绘制所有的轮廓
  • color:轮廓的颜色,如(0,0,255)表示红色
  • thickness:线宽,-1表示全部填充

示例代码如下:

import cv2
import numpy as np
# 导入图片
img = cv2.imread("black.png")
# 变为单通道的黑白照片
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 二值化操作  ---  返回两个值:阈值和结果
ret, new_img = cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY)
# 查找轮廓
contours, hierarchy = cv2.findContours(new_img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# 绘制轮廓
img_copy = img.copy()
# 直接在img_copy上面操作
cv2.drawContours(img_copy, contours, -1, (0, 0, 255), 2)
cv2.imshow("img", np.hstack((img, img_copy)))
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果如下:

四、轮廓的面积和周长

轮廓的面积指的是每个轮廓中所有的像素点围成的区域的面积单位为像素

轮廓面积是轮廓重要的统计特征之一,通过轮廓面积的大小可以进一步分析每个轮廓隐含的信息, 例如通过轮廓面积区分物体大小识别不同的物体

在查找到轮廓之后,可能会有很多细小的轮廓,我们可以通过轮廓的面积进行过滤。

计算轮廓面积:contourArea (contour)

计算轮廓周长:arcLength (curve, closed)

  • curve : 轮廓
  • closed:判断是否为闭合的轮廓

示例代码如下:

import cv2
import numpy as np
# 导入图片
img = cv2.imread("black.png")
# 变为单通道的黑白照片
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 二值化操作  ---  返回两个值:阈值和结果
ret, new_img = cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY)
# 查找轮廓
contours, hierarchy = cv2.findContours(new_img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# 绘制轮廓
img_copy = img.copy()
# 直接在img_copy上面操作
cv2.drawContours(img_copy, contours, -1, (0, 0, 255), 2)
cv2.imshow("img", np.hstack((img, img_copy)))
# 计算轮廓的周长和面积
Area = cv2.contourArea(contours[0])
perimeter = cv2.arcLength(contours[1], closed=True)
print(Area)
print(perimeter)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果如下:

其中第一个为面积,第二个为周长。 


http://www.kler.cn/a/233962.html

相关文章:

  • leetcode 27. 移除元素
  • Unity功能模块一对话系统(1)前置准备
  • 全面Kafka监控方案:从配置到指标
  • 爬虫代理服务要怎么挑选?
  • cesium入门学习二
  • 低代码开发中 DDD 领域驱动的页面权限控制
  • Nginx 配置 SSL证书
  • 【JavaScript】数组的创建和操作
  • Xampp中Xdebug的安装使用
  • 大数据思考:面对海量数据时,选择哪种模式才是更适合自己的?
  • 深入探索Redis:如何有效遍历海量数据集
  • 在容器镜像中为了安全为什么要删除 setuid 和 setgid?
  • Java图形化界面编程——菜单组件 笔记
  • 【EAI 014】Gato: A Generalist Agent
  • 1.6 Binance_interface API 现货交易账户
  • QT+OSG/osgEarth编译之八十二:osgdb_obj+Qt编译(一套代码、一套框架,跨平台编译,版本:OSG-3.6.5插件库osgdb_obj)
  • Mockito测试框架中的方法详解
  • JUnit实践教程——Java的单元测试框架
  • 程序设计语言的组成
  • SAP-PP-01-005工作中心
  • Swift Combine 使用 dataTaskPublisher 发起网络请求 从入门到精通十
  • 2024年腾讯云4核8G12M服务器性能测评,适合哪些使用场景?
  • 【Make编译控制 08】CMake动静态库
  • MySQL进阶查询篇(7)-触发器的创建和使用
  • 【leetcode热题100】 格雷编码
  • 从信息隐藏到功能隐藏