Python:Opencvcv2.findContours()函数查轮廓cv.findContours()
参数:
①要寻轮廓的图像只能传⼊⼆值图像,不是灰度图像
②轮廓的检索模式,有四种:
cv2.RETR_EXTERNAL表⽰只检测外轮廓
cv2.RETR_LIST检测的轮廓不建⽴等级关系
cv2.RETR_CCOMP建⽴两个等级的轮廓,上⾯的⼀层为外边界,⾥⾯的⼀层为内孔的边界信息。如果内孔内还有⼀个连通物体,这个物体的边界也在顶层
cv2.RETR_TREE建⽴⼀个等级树结构的轮廓
③轮廓的近似办法
cv2.CHAIN_APPROX_NONE存储所有的轮廓点,相邻的两个点的像素位置差不超过1,
即max(abs(x1-x2),abs(y2-y1))==1
cv2.CHAIN_APPROX_SIMPLE压缩⽔平⽅向,垂直⽅向,对⾓线⽅向的元素,只保留该⽅向的终点坐标,例如⼀个矩形轮廓只需4个点来保存轮廓信息
返回值:
contours:⼀个列表,每⼀项都是⼀个轮廓,不会存储轮廓所有的点,只存储能描述轮廓的点
hierarchy:⼀个ndarray, 元素数量和轮廓数量⼀样,
每个轮廓contours[i]对应4个hierarchy元素hierarchy[i][0] ~hierarchy[i][3],分别表⽰后⼀个轮廓、前⼀个轮廓、⽗轮廓、内嵌轮廓的索引编号,如果没有对应项,则该值为负数
坑点!!!:
出现如下错误
ValueError: need more than 2 values to unpack
在Opencv4.0中 cv.findContours()的返回值以从三个变为⼆个,见如下官⽅⽂档
查边框及对圆形、矩形进⾏画框的程序如下:
import cv2
import numpy as np
# 读⼊图像
img = cv2.imread(r"D:\360MoveData\Users\KID\Desktop\1.jpg", cv2.IMREAD_UNCHANGED)
# ⼆值化
ret, thresh = cv2.threshold(
cv2.py(), cv2.COLOR_BGR2GRAY), # 转换为灰度图像,
130, 255, # ⼤于130的改为255 否则改为0
cv2.THRESH_BINARY) # ⿊⽩⼆值化
# 搜索轮廓
contours, hierarchy = cv2.findContours(
thresh,
cv2.RETR_EXTERNAL,
cv2.CHAIN_APPROX_SIMPLE)
for c in contours:
x, y, w, h = cv2.boundingRect(c)
"""
传⼊⼀个轮廓图像,返回 x y 是左上⾓的点, w和h是矩形边框的宽度和⾼度
"""
"""
画出矩形
img 是要画出轮廓的原图
(x, y) 是左上⾓点的坐标
(x+w, y+h) 是右下⾓的坐标
rectangle函数opencv0,255,0)是画线对应的rgb颜⾊
2 是画出线的宽度
"""
# 获得最⼩的矩形轮廓可能带旋转⾓度
rect = cv2.minAreaRect(c)
# 计算最⼩区域的坐标
box = cv2.boxPoints(rect)
# 坐标规范化为整数
box = np.int0(box)
# 画出轮廓
cv2.drawContours(img, [box], 0, (0, 0, 255), 3)
# 计算最⼩封闭圆形的中⼼和半径
(x, y), radius = cv2.minEnclosingCircle(c)
# 转换成整数
center = (int(x), int(y))
radius = int(radius)
# 画出圆形
img = cv2.circle(img, center, radius, (0, 255, 0), 2) # 画出轮廓
cv2.drawContours(img, contours, -1, (255, 0, 0), 1) cv2.imshow("contours", img)
cv2.waitKey()
cv2.destroyAllWindows()
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论