Python OpenCV findContours()函数与drawContours()函数用法

Python OpenCV findContours()函数与drawContours()函数用法我用的Python3.6,OpenCV3.4。Python3.x与2.x语法不一样,OpenCV2.x与3.x也不一样。看之前得清楚自己用的啥。本文说白了就是个简单的查找轮廓,并且绘制轮廓。简单说一下这俩个函数用法。函数cv2.findContours()有三个参数。第一个是输入图像,第二个是轮廓检索模式,第三个是轮廓近似方法。而返回值根据OpenCV版本不同也不一样,但这俩个版本都会返回…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

我用的Python3.6,OpenCV3.4。Python3.x与2.x语法不一样,OpenCV2.x与3.x也不一样。看之前得清楚自己用的啥。

本文说白了就是个简单的查找轮廓,并且绘制轮廓。简单说一下这俩个函数用法。

  • 函数cv2.findContours()有三个参数第一个是输入图像,第二个是轮廓检索模式,第三个是轮廓近似方法。而返回值根据OpenCV版本不同也不一样,但这俩个版本都会返回一个元组。OpenCV2.x版本第一个元素是轮廓,,而在OpenCV3.x中第二个才是轮廓。这个轮廓是一个列表,每个列表元素代表着一个轮廓。

  • cv2.findContours()第二个参数有什么用?对于轮廓来说可能还包含父子关系,也就是说一个轮廓里面可能还包含着其他轮廓(比如说房子的轮廓可以包含一个矩形的窗户,则房子为父,窗户为子,而窗户里可能有个人的头,这又是一种父子关系),这其中的层次结构可以通过对第二个参数设置来选择是否获取。轮廓关系图
    在这幅图中,给这几个形状编号为 0-5。 2 和 2a 分别代表最外边矩形的外轮廓和内轮廓。在这里边轮廓 0, 1, 2 在外部或最外边。我们可以称他们为(组织结构)0 级,简单来说就是他们属于同一级。接下来轮廓 2a。 我们把它当成轮廓 2 的子轮廓。它就成为(组织结构)第1 级。同样轮廓 3 是轮廓 2 的子轮廓,成为(组织结构)第 3 级。最后轮廓4,5 是轮廓 3a 的子轮廓,成为(组织结构) 4 级(最后一级)。按照这种方式给这些形状编号。而在OpenCV有哪些参数可选呢?
    RETR_LIST 从解释的角度来看,这中应是最简单的。它只是提取所有的轮廓,而不去创建任何父子关系。
    RETR_EXTERNAL 如果你选择这种模式的话,只会返回最外边的的轮廓,所有的子轮廓都会被忽略掉。
    RETR_CCOMP 在这种模式下会返回所有的轮廓并将轮廓分为两级组织结构。
    RETR_TREE 这种模式下会返回所有轮廓,并且创建一个完整的组织结构列表。它甚至会告诉你谁是爷爷,爸爸,儿子,孙子等。

  • findContours()第三个参数什么意思呢?如果设为cv2.CHAIN_APPROX_NONE,,表示边界所有点都会被储存;而如果设为cv2.CHAIN_APPROX_SIMPLE 会压缩轮廓,将轮廓上冗余点去掉,比如说四边形就会只储存四个角点。

  • 函数cv2.drawContours()被用来绘制轮廓。第一个参数是一张图片,可以是原图或者其他。第二个参数是轮廓,也可以说是cv2.findContours()找出来的点集,一个列表。第三个参数是对轮廓(第二个参数)的索引,当需要绘制独立轮廓时很有用,若要全部绘制可设为-1。接下来的参数是轮廓的颜色和厚度。

还有在使用OpenCV查找轮廓时,为了更准确,需要进行二值化处理:阈值化处理或者进行Canny边缘检测。查找轮廓的函数会修改原始图片,当需要使用原始图片时得注意。并且在OpenCV中查找轮廓就像在黑色背景中找白色背景,所以要找的物体应该是白色,而背景是黑色(来源于OpenCV官方教程中文版)。下面上代码:

import numpy as np
import cv2

#读取图片
img = cv2.imread('city.jpg')
#二值化,canny检测
binaryImg = cv2.Canny(img,50,200)

#寻找轮廓
#也可以这么写:
#binary,contours, hierarchy = cv2.findContours(binaryImg,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE) 
#这样,可以直接用contours表示
h = cv2.findContours(binaryImg,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
#提取轮廓
contours = h[0]
#打印返回值,这是一个元组
print(type(h))
#打印轮廓类型,这是个列表
print(type(h[1]))
#查看轮廓数量
print (len(contours))

#创建白色幕布
temp = np.ones(binaryImg.shape,np.uint8)*255
#画出轮廓:temp是白色幕布,contours是轮廓,-1表示全画,然后是颜色,厚度
cv2.drawContours(temp,contours,-1,(0,255,0),3)

cv2.imshow("contours",temp)
cv2.waitKey(0)
cv2.destroyAllWindows()

Jetbrains全家桶1年46,售后保障稳定

注意由于是OpenCV3,所以返回值只有一个。如果是2.x则是需要俩个返回值,不然会报错。下面放图:
原图

处理后的图

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/210454.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • networkmanager设置开机启动_network connectivity assistant

    networkmanager设置开机启动_network connectivity assistant通常的linux发行版对于网络的配置方法一般会同时支持network.service(即配置和使用/etc/sysconfig/network-scripts/下的配置文件来配置网络,对于ubuntu是/etc/network/interfaces等等)和NetworkManager.service(简称NM)。默认情况下,这2个服务都有开启,而且功能上是平行的,可以通过任意一个来配置网络,正常的情况下通过NM来配置网络后它会自动把配置同步到network.service的配置中。NM能管理各种网络

  • navicat 15激活码(破解版激活)

    navicat 15激活码(破解版激活),https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

  • 天才就是这样炼成的

    天才就是这样炼成的from 水木社区 天才就是这样炼成的——记菲尔兹奖获得者澳大利亚数学神童、陶哲轩作者:舒锋澳大利亚土生土长的华裔天才陶哲轩(TerrenceTao)于2006年年8月获得数学界的诺贝尔奖–菲尔兹奖(FieldsMedal)。国际数学会(IMU)每年在国际数学大会上颁菲尔兹奖给两至四名数学家,IMU表示,陶教授被颁这个殊荣,是因他对偏微分方程、组合数学、混合分析和堆垒素数论的杰出贡献。陶

  • 用户名与计算机名命名规则

    用户名与计算机名命名规则

  • QtreeWidget简介「建议收藏」

    QtreeWidget简介「建议收藏」设置右键菜单并实现添加一个子项删除一个子项的功能这样有两个缺点1.只能添加特定的子项。2.不能实现不同层级节点的不同菜单。dialog.cppwidget.cppwidget.h还可以通过TYPE属性来确定每一个节点的层级。代码实现mainwindow.cppmainwindow.hdialog.cppdialog.h参考博客…

    2022年10月30日
  • 一套很好的.net控件radcontrols介绍

    一套很好的.net控件radcontrols介绍中文在线阅读器简介:最新的项目有一个是XPS的在线阅读器,这个项目可以说是一个典点的Silverlight商业项目应用,用户可以直接通过一个website查看一个xps文档,这个程序类似目前网站上常见的Flash阅读器,XPS是微软的第的文件格式,是与Adobe的PDF文件格式对立的新格式,而且直接被Office2007(Office12)和WindowsVista支持…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号