OpenCV-图像轮廓 轮廓特征、轮廓周长和面积、轮廓近似、外接矩形和外接圆

概念

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码实现

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

得到轮廓之后,计算轮廓的周长和面积

得到轮廓的周长和面积

使用cv2.findCountor获得的轮廓contours是一个嵌套的类型,即我们可以通过cnt = contours获得第25个物体的轮廓值

cnt = contours[24]
#面积
cv2.contourArea(cnt)
length= cv2.arcLength(cnt, True)
print(area, length)

在这里插入图片描述
在这里插入图片描述

轮廓近似

轮廓不规则,然后让他近似为规整的。
在这里插入图片描述
在这里插入图片描述
有点类似于不断二分
在这里插入图片描述

# 轮廓近似
img = cv2.imread('girl.png')#读入图片
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)#灰度图
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)#二值变化

contours, h = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)#获得图片的轮廓值

cnt = contours[24]

# 使用周长的倍数作为阈值,阈值越小,图像的轮廓近似与轮廓越近似
epsilon = 0.1 * cv2.arcLength(cnt, True)

approx = cv2.approxPolyDP(cnt, epsilon, True)

draw_img = img.copy()
ret = cv2.drawContours(draw_img, [approx], -1, (0, 0, 255), 2)
cv_show(ret, 'ret')

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

外接矩形和外接圆

外接矩形: 使用cv2.boudingrect(cnt)获得轮廓的外接矩形,使用cv2.rectangle(img, (x, y), (x+w, y+h), (0, 0, 255), 2)画出矩阵的轮廓

外接圆: 使用cv2.minEnclosingCircle(cnt)获得轮廓的外接圆,使用cv2.circle(ret, centers, radius, (0, 0, 255), 2)画出圆的轮廓

代码:

第一步:载入图片,灰度化,二值化,使用cv2.findCountors找出图像的轮廓,使用轮廓索引获得第一个轮廓cnt

第二步:使用cv2.boundingrect(cnt) ,获得轮廓的x,y,w, h (x, y)表示左上角的坐标,w为宽,h为长

第三步: 使用cv2.rectangle 绘制外接的轮廓

第四步: 使用cv2.minEnclosingCircle(cnt), 获得center和radius,即圆心点的坐标和圆的半径

第五步: 使用cv2.circle(img, center, radius, (0, 0, 255), 2) 绘制圆心的外接轮廓

# 外接矩阵

img = cv2.imread('girl.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
res, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)

contours, h = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)

cnt = contours[24]

x, y, w, h = cv2.boundingRect(cnt)

ret = cv2.rectangle(img, (x, y), (x+w, y+h), (0, 0, 255), 2)
cv_show(ret, 'ret')

print('矩形面积 / 外接矩形面积', cv2.contourArea(cnt) / (w*h))
矩形面积 / 外接矩形面积 0.6702044025157232

在这里插入图片描述

在这里插入图片描述

#外接圆
(x, y), radius = cv2.minEnclosingCircle(cnt)
center = (int(x), int(y))
radius = int(radius)
ret = cv2.circle(ret, center, radius, (0, 255, 0), 2)
cv_show(ret, 'ret')

在这里插入图片描述
参考链接

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值