OpenCV 轮廓:开始

目标

  • 了解轮廓是什么。
  • 学会寻找轮廓,绘制轮廓等。
  • 您将看到以下功能:cv2.findContos()cv2.drawContours()

轮廓是什么?

轮廓可以简单地解释为连接所有连续点(沿边界)的曲线,具有相同的颜色或强度。轮廓是形状分析和目标检测与识别的有效工具。

  • 为了获得更高的精度,请使用二进制图像。因此,在寻找轮廓之前,应用阈值或精明的边缘检测。
  • findContos函数修改源图像。因此,如果您想要源图像,即使在找到轮廓之后,已经将其存储到其他变量中。
  • 在OpenCV中,寻找轮廓就像从黑色背景中寻找白色物体一样。所以请记住,要找到的物体应该是白色的,背景应该是黑色的。

让我们看看如何找到二值图像的轮廓:

import numpy as np
import cv2

im = cv2.imread('test.jpg')
imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(imgray,127,255,0)
contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

看,cv2.findContos()函数有三个参数,第一是源图像,第二是轮廓检索模式,第三是轮廓近似方法。并输出等高线和层次结构。等高线是图像中所有轮廓的Python列表。每个单独的轮廓都是对象边界点(x,y)坐标的Numpy数组。

如何绘制轮廓?

为了画轮廓,使用cv2.drawContours函数。它也可以用来绘制任何形状,只要你有它的边界点。第一个参数是源图像,第二个参数是应该作为Python列表传递的轮廓,第三个参数是等高线索引(在绘制单个轮廓时有用)。绘制所有轮廓,传递-1)和剩余的参数是颜色,厚度等。

若要绘制图像中的所有轮廓,请执行以下操作:

cv2.drawContours(img, contours, -1, (0,255,0), 3)

要绘制一个单独的等高线,比如第四个等高线:

cv2.drawContours(img, contours, 3, (0,255,0), 3)

但大多数情况下,下面的方法将是有用的:

cnt = contours[4]
cv2.drawContours(img, [cnt], 0, (0,255,0), 3)

等高线逼近法

上面,我们告诉我们,等高线是一个形状的边界,具有相同的强度。它存储形状边界的(x,y)坐标。但是它能存储所有的坐标吗?这是由此等高线近似方法指定的。

如果你通过cv2.CHAIN_APPROX_NONE,所有的边界点都被存储起来。但我们真的需要所有的点吗?例如,你找到了一条直线的轮廓线。你需要这条线上的所有点来表示这条线吗?不,我们只需要那条线的两个终点。这就是cv2.CHAIN_APPROX_SIMPLE的确如此。它删除所有冗余点并压缩轮廓,从而节省内存。

下面的矩形图像演示了这一技术。只需在等高线数组中的所有坐标上画一个圆圈(用蓝色绘制)。第一张照片显示了我得到的点cv2.CHAIN_APPROX_NONE(734个点)第二张图片显示cv2.CHAIN_APPROX_SIMPLE(仅4个点)。看,这节省了多少内存!

Contour Retrieval Method

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值