Opencv学习笔记(八)轮廓检测

轮廓检测

轮廓是具有相同色彩或者灰度的曲线,在形状分析和物体检测中具有很重要的作用。

API详解

cv2.findContours()
cv2.findContours() 函数查找轮廓,:第一个参数为输入图像;第二个参数为轮廓的检索模式,cv2.RETR_TREE会得到图像中轮廓的整体层次结构,建立轮廓之间的关系;
cv2.RETR_EXTERNAL得到最外面的轮廓,消除轮廓之内的轮廓。
第三个是轮廓的近似方法,cv2.CHAIN_APPROX_NONE存储边界上的所有点;cv2.CHAIN_APPROX_SIMPLE只存储边界线的端点,去掉了轮廓上的冗余点,节省内存开支。
两个返回值,第一个是轮廓(列表形式), 第二个是轮廓的层析结构。
cv2.drawContours()
cv2.drawContours()绘制轮廓: 第一个参数为原始图像,第二个参数为轮廓(列表),第三个参数为轮廓的索引(在绘制独立轮廓时使用, -1 表示绘制所有轮廓),第四个参数为轮廓的颜色, 第五个参数为线宽。
cv2.boundingRect()
cv2.boundingRect()得到一个直矩形,返回值为直矩形的起点坐标x,y 和矩形的w,h 。
cv2.minAreaRect()
cv2.minAreaRect()得到旋转矩形,返回值为矩形的中心坐标(x, y),(w,h), 旋转角度(角度范围在[-90, 0])。
cv2.boxPoints()
cv2.boxPoints()返回矩形的四个顶点坐标,坐标为浮点型,需要转换为整型。
cv2.minEnclosingCircle()
cv2.minEnclosingCircle()得到最小外接圆,返回圆心坐标和半径,也需要进行浮点型转换为整型 。
cv2.fitEllipse()
椭圆拟合 :cv2.fitEllipse()输入的点集至少包含六个点,返回值为椭圆的中心坐标、长短轴径、旋转角度。

代码

import cv2
import numpy as np

src = cv2.imread(r'F:\OPENCV\Opencv\test2.png', cv2.IMREAD_COLOR)
img = src.copy()
if src is None:
    print('image is null')
blur = cv2.medianBlur(src, 5)
gray = cv2.cvtColor(blur, cv2.COLOR_BGR2GRAY)

ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU + cv2.THRESH_BINARY)
# cv2.findContours()查找轮廓,输入图像为黑底的二值图
contours, hierarchy = cv2.findContours(~thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
img = src.copy()
img = cv2.drawContours(img, contours, -1, (0, 0, 255), 2)
cv2.namedWindow('img', cv2.WINDOW_NORMAL)
cv2.imshow('img', img)

dst = src.copy()
for contour in contours:
    # 直矩形
    x, y, w, h = cv2.boundingRect(contour)
    cv2.rectangle(dst, (x, y), (x + w, y + h), (255, 0, 0), 2)
    # 旋转矩形(最小外接矩形)
    rect = cv2.minAreaRect(contour)
    box = cv2.boxPoints(rect)
    box = np.int0(box)
    cv2.drawContours(dst, [box], 0, (0, 255, 0), 2)
    # 最小外接圆
    (x, y), radius = cv2.minEnclosingCircle(contour)
    center = (int(x), int(y))
    radius = int(radius)
    cv2.circle(dst, center, radius, (0, 0, 255), 2)
    # 椭圆拟合
    ellipse = cv2.fitEllipse(contours[0])
    cv2.ellipse(dst, ellipse, (255, 0, 0), 2)

cv2.namedWindow('dst', cv2.WINDOW_NORMAL)
cv2.imshow('dst', dst)

cv2.waitKey()
cv2.destroyAllWindows()

结果显示
在这里插入图片描述

参考

1.OpenCV-Python官方教程
2.OpenCV3计算机视觉

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值