opencv初学(图像10)

轮廓检测方法的API

binary,contours,hierarchy=cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)

返回值:

binary:img的灰度图

contours:轮廓信息,一个list文件

hierarchy:层数信息

摘自1-轮廓检测方法_哔哩哔哩_bilibili

详细介绍可参考cv2.findContours()一颗磐石的博客

res=cv2.drawContours(draw_img,contours,-1,(0,0,255),2)

参数1是指明在哪幅图像上绘制轮廓;image为三通道才能显示轮廓

参数2是轮廓本身,在Python中是一个list;

参数3指定绘制轮廓list中的哪条轮廓,如果是-1,则绘制其中的所有轮廓,可以指定外层or内层轮廓(多尝试不同的参数)。

参数4为绘制的颜色,

参数5是,绘制线条宽度,如果是-1(cv2.FILLED),则为填充模式。

注意本API会改变原图并保存,使用前记得备份(cv2.copy())

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

def cv_show(name,image):
    cv2.imshow(name,image)
    cv2.waitKey()
    cv2.destroyAllWindows()

#读取轮廓
img=cv2.imread('D:/BaiduNetdiskDownload/opencv/contours.jpg')
img_gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#先转化为二值图
ret,thresh = cv2.threshold(img_gray,127,255,cv2.THRESH_BINARY)#转化为二值图 0 , 255
#灰度图、轮廓信息、层数信息
binary,contours,hierarchy=cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)

#绘制轮廓
#传入绘制图像,轮廓,轮廓索引(可以多整几个值试试),颜色,线条宽度
#注意此语句会改变原图,所以请copy一份
draw_img=img.copy()
res=cv2.drawContours(draw_img,contours,-1,(0,0,255),2)
cv_show('lunkuo',res)
cnt=contours[0]

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

这个函数可以获得一个图像的最小矩形边框一些信息

参数img:一个二值图像

返回值四个参数:左上角坐标下x,y,矩形的宽w,高h。

#边界矩阵
x,y,w,h=cv2.boundingRect(cnt)
img = cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)

area=cv2.contourArea(cnt)
x,y,w,h=cv2.boundingRect(cnt)
rect_area=w*h
extent=float(area)/rect_area
print("轮廓面积与边界矩形比",extent)
cv_show('1',img)

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

参数1:图像

参数2:阈值

参数3:是否闭合

#轮廓近似
img=cv2.imread('D:/BaiduNetdiskDownload/opencv/contour2.png')
img_gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,thresh=cv2.threshold(img_gray,127,255,cv2.THRESH_BINARY)
binary,contours,hierarchy=cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
cnt=contours[0]

draw_img=img.copy()
res=cv2.drawContours(draw_img,[cnt],-1,(0,0,255),2)
print(type(cnt))
cv_show('11',res)

epsilon=0.01*cv2.arcLength(cnt,True)
approx=cv2.approxPolyDP(cnt,epsilon,True)
draw_img=img.copy()
res=cv2.drawContours(draw_img,[approx],-1,(0,0,255),2)
cv_show('111',res)

一些简单的API



"""
#轮廓特征
cnt=contours[0]
#面积
S=cv2.contourArea(cnt)
print(S)
#周长(True指周长)
L=cv2.arcLength(cnt,True)
print(L)
"""
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值