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

【OpenCV】12 图像轮廓

图像轮廓:具有相同颜色或相同强度的连续点的曲线。

作用:

  1. 图形分析
  2. 物体的识别和检测

注意点:

  1. 为了检测准确性,需要先对图像进行二值化或者Canny操作
  2. 画轮廓时会修改输入图像

mode

RETR_EXTERNAL = 0 只检测外轮廓

image

RETR_LIST = 1 检测的轮廓不建立等级关系

从里到外,从右到左
image

RETR_CCOMP = 2 每层最多两级

image

RETR_TREE = 3 按树形存储轮廓

image

import cv2
import numpy as npcat = cv2.imread('img/maodie.jpg')
cat_gray = cv2.cvtColor(cat, cv2.COLOR_BGR2GRAY)
ret, cat_binary = cv2.threshold(cat_gray, 210, 255, cv2.THRESH_BINARY)# 寻找最外层轮廓
contours, hierarchy = cv2.findContours(cat_binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)# 绘制轮廓
# contourIdx   -1 绘制所有轮廓
# thickness 线宽    -1 全部填充
cv2.drawContours(cat_binary, contours, -1, (0, 0, 255), 1)# 计算面积
area = cv2.contourArea(contours[0])
print("area=%d"%(area))# 计算周长
len = cv2.arcLength(contours[0], True)
print("len=%d"%(len))cv2.imshow('cat', cat)
cv2.imshow('cat_binary', cat_binary)cv2.waitKey(0)

多边形逼近和凸包

import cv2
import numpy as npdef drawShape(src, points):i = 0while i < len(points):if i== len(points) - 1:x, y = points[i][0]x1, y1 = points[0][0]cv2.line(src, (x, y), (x1, y1), (0, 0, 255), 3)else:x, y = points[i][0]x1, y1 = points[i+1][0]cv2.line(src, (x, y), (x1, y1), (0, 0, 255), 3)i = i + 1cat = cv2.imread('img/maodie.jpg')
cat_gray = cv2.cvtColor(cat, cv2.COLOR_BGR2GRAY)
ret, cat_binary = cv2.threshold(cat_gray, 210, 255, cv2.THRESH_BINARY)# 寻找最外层轮廓
contours, hierarchy = cv2.findContours(cat_binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)# 绘制轮廓
# contourIdx   -1 绘制所有轮廓
# thickness 线宽    -1 全部填充
cv2.drawContours(cat_binary, contours, -1, (0, 0, 255), 1)e = 5
approx = cv2.approxPolyDP(contours[0], e, True)drawShape(cat, approx)# 绘制凸包
hull = cv2.convexHull(contours[0])drawShape(cat, hull)cv2.imshow('cat', cat)
cv2.imshow('cat_binary', cat_binary)cv2.waitKey(0)

外接矩形

image

import cv2
import numpy as npdef drawShape(src, points):i = 0while i < len(points):if i== len(points) - 1:x, y = points[i][0]x1, y1 = points[0][0]cv2.line(src, (x, y), (x1, y1), (0, 0, 255), 3)else:x, y = points[i][0]x1, y1 = points[i+1][0]cv2.line(src, (x, y), (x1, y1), (0, 0, 255), 3)i = i + 1cat = cv2.imread('img/maodie.jpg')
cat_gray = cv2.cvtColor(cat, cv2.COLOR_BGR2GRAY)
ret, cat_binary = cv2.threshold(cat_gray, 210, 255, cv2.THRESH_BINARY)# 轮廓查找
contours, hierarchy = cv2.findContours(cat_binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)# 最小外接矩阵
r = cv2.minAreaRect(contours[1])
box = cv2.boxPoints(r)
box = np.array(box, dtype=np.int32)
cv2.drawContours(cat, [box], 0, (0, 0, 255), 2)# 最大外接矩形
x, y, w, h = cv2.boundingRect(contours[1])
cv2.rectangle(cat, (x, y), (x + w, y + h), (255, 0, 0), 2)cv2.imshow('cat', cat)
cv2.imshow('cat_binary', cat_binary)cv2.waitKey(0)
http://www.hskmm.com/?act=detail&tid=20691

相关文章:

  • IntroJS-即时入门-全-
  • 数字设计的新篇章:前沿技术与未来趋势
  • 2025 镀锌方管厂家最新权威推荐排行榜:聚焦行业标杆与新锐品牌,镀锌方管优质厂家深度解析
  • mysql启动方式导致链接数max_connections查询的值不一致
  • cmakelist
  • 供应商协同平台:打造高效安全供应链的关键
  • 互斥锁和信号量机制
  • NSIS为当前用户安装和为所有用户安装的选择
  • 数据中台厂商选型|解决方案厂商与独立中台厂商详细解读
  • 深度学习项目全流程实践与核心技术解析:从数据处理到模型优化 - 教程
  • 直接使用的NLog帮助类
  • 【每日一面】setTimeout 延时为 0 的情况
  • AI元人文:悟空博弈框架
  • sway - wayland下截图方案
  • 不同网络间文件互传怎么实现?
  • sway wayland下 wps-office无法输入中文
  • 科学史笔记
  • Spring XML 设置简介
  • 2025 年真空泵品牌最新权威推荐排行榜:覆盖真空泵维修,真空泵机组,真空泵油,真空泵配件领域选择指南
  • 专业的跨网文件交换系统 和传统FTP/U盘拷贝有什么区别?
  • 0voice-2.1.4-http服务器的实现
  • CF *2600 思维题 2
  • 中低压配网设备介绍
  • vue3使用路由配置
  • 分享一个YTB视频下载器
  • 基于Python+Vue开发的家具商城管理系统源码+运行步骤
  • 2025年,CRM口碑排行榜:从SAAS到本地部署方案
  • Arraylist集合原理分析
  • Commitlint 使用指南
  • VonaJS提供的读写分离,直观,优雅