• OpenCV学习笔记(12)——OpenCV中的轮廓


    • 什么是轮廓
    • 找轮廓、绘制轮廓等

    1.什么是轮廓

      轮廓可看做将连续的点(连着边界)连在一起的曲线,具有相同的颜色和灰度。轮廓在形态分析和物体的检测和识别中很有用。

    • 为了更加准确,要使用二值化图像。在寻找轮廓之前,要进行阈值化处理或者Canny边界检测。
    • 查找轮廓的函数会修改原始图像。如果に在找到轮廓后还想使用原始图像的话,应该把原始图像存储到其他变量中。
    • 在OpenCV中,查找轮廓就像是在黑色背景中找白色物体,要记住要找的物体应该是白色而背景应该是黑色

    让我们看看如何在一个二值图像中查找轮廓:

      cv2.findContours()有3个参数,第一个是输入图像,第二个是轮廓检索模式,第三个是轮廓近似方法。返回值有三个,第一个是图像,第二个是轮廓,第三个是(轮廓的)层析结构。第二个返回值轮廓是一个Python列表,其中存储这图像中的所有轮廓。每一个轮廓都是一个Numpy数组,包含对象边界点(x,y)的坐标。

    2.怎样绘制轮廓

      cv2.drawContour()可以用来绘制轮廓。你可以根据你提供的边界点绘制任何形状。它的第一个参数是原始 图像,第二个参数是轮廓,一个Python列表。第三个参数是轮廓的索引(在绘制独立轮廓时相当有用,当设置为-1时将绘制所有轮廓)。接下来的参数是轮廓的颜色,厚度等。

      一下例程在一幅图中绘制所有的轮廓:

    # -*- coding:utf-8 -*-

    import numpy as np
    import cv2
    from matplotlib import pyplot as plt

    im = cv2.imread('2.jpg')
    imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
    ret,thresh = cv2.threshold(imgray,200,255,cv2.THRESH_BINARY_INV)
    cv2.imshow('img1',thresh)

    img,contours,hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
    #以上设置是较为通用的用法,后面会讲到一些具体的设置参数
    #这一步会把thresh变为轮廓图,即与img相同;然而不断试验并没发现thresh发生任何变化
    #网上有说这个函数只有两个返回值的,但试过会报错

    cv2.drawContours(im,contours,-1,(0,0,255),1)
    #这一步会把轮廓线画在im中

    print(len(contours))#可以看到一共绘制出了多少个轮廓
    cv2.imshow('img',im)
    cv2.waitKey(0)

    效果如下

    3.轮廓的近似方法

      表示这个设置的是cv2;findCountours()的第三个参数。之前我们提到轮廓是一个形状具有相同灰度值的边界,它会存储形状边界上所有的(x,y)坐标。但是需要将这所有的边界点都存储么?这就是这个设置参数改变的东西。

      这个参数如果设置为cv2.CHAIN_APPROX_NONE,则所有的边界点都会被存储。但是有的时候,比如边界是一条直线的时候,我们并不需要这么多的点来表示直线,只需要这条直线的端点就够了。这就是cv2.CHAIN_APPROX_SIMLE做的。它会把轮廓上的冗余点都去掉,以压缩轮廓节省内存开支。

    P.S 几个参数的物理含义

    cv2.findCountours():

     输入的第二个参数表示轮廓的检索模式,有四种(本文介绍的都是新的cv2接口):
        cv2.RETR_EXTERNAL表示只检测外轮廓
        cv2.RETR_LIST检测的轮廓不建立等级关系
        cv2.RETR_CCOMP建立两个等级的轮廓,上面的一层为外边界,里面的一层为内孔的边界信息。如果内孔内还有一个连通物体,这个物体的边界也在顶层。
        cv2.RETR_TREE建立一个等级树结构的轮廓

       

        输出的的参数中,

      hierarchy :这是一个ndarray,其中的元素个数和轮廓个数相同,每个轮廓contours[i]对应4个hierarchy元素hierarchy[i][0] ~hierarchy[i][3],分别表示后一个轮廓、前一个轮廓、父轮廓、内嵌轮廓的索引编号,如果没有对应项,则该值为负数。

  • 相关阅读:
    (三)Java学习-简单了解JMS与ActiveMQ
    (二)Java并发包-线程池
    (一)Java多线程学习
    zookeeper学习-4数据节点与zkCli客户端命令
    zookeeper学习-3集群环境搭建
    zookeeper学习-1初步了解
    201871010101-陈来弟 实验四 团队作业1:软件研发团队组建
    201871010101-陈来弟《软件工程课程》实验三 软件工程结对项目
    201871010101-陈来弟 实验二 个人项目——《西北师范大学学生疫情上报系统》项目报告
    201871010101-陈来弟《软件工程课程》实验一 软件工程准备
  • 原文地址:https://www.cnblogs.com/zodiac7/p/9286531.html
Copyright © 2020-2023  润新知