《查找绘制轮廓,计算轮廓面积-python_opencv》

 重点:

一、查找图像轮廓:findContours()函数

coutours, hierarchy = cv.findContours(binary, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_NONE)


    1、image与函数参数中的原图像一致 (opencv4~取消第一个参数)
    2、coutours返回的轮廓
    3、hierarchy图像的拓扑信息(轮廓层次)处理后
    A、image:原始图像(灰度图像自动转换为二值化图像)
    B、mode:轮廓检索模式(所用到的是检测外孔和内孔轮廓)
    C、method:轮廓的近似方法(所用到的是储存所有轮廓点)
二、cv.THRESH_BINARY_INV(反二值化阈值)

ret, binary = cv.threshold(gray, 127, 255, cv.THRESH_BINARY_INV)  # 反二值化阈值


三、计算轮廓数量

coutours, hierarchy = cv.findContours(binary, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_NONE)
n = len(coutours)

 四、反二值化阈值参考资料

 

全部代码:

# 导入模块
import cv2 as cv
import numpy as np

# 读取图片(图片路径不能有中文字符)
img1 = cv.imread("experiment/buguize.jpg")
# 创建窗口:'discern'为创建窗口的名字;0是为下一步设置窗口尺寸设置的
cv.namedWindow("img1", 0)
# 设置窗口尺寸,单位为Px(像素):"img1"为要设置尺寸的窗口
cv.resizeWindow("img1", 500, 500)
# 设置窗口位置:img1(要设置位置的窗口名字),第二和第三个参数为要设置窗口的大小(x,y)
cv.moveWindow("img1", 380, 200)
# 显示窗口:"img1"(内容所显示在的窗口),第二个参数(要显示的内容)
cv.imshow("img1", img1)
gray = cv.cvtColor(img1, cv.COLOR_BGR2GRAY)  # 色彩转换
ret, binary = cv.threshold(gray, 127, 255, cv.THRESH_BINARY_INV)  # 反二值化阈值
# 查找轮廓
coutours, hierarchy = cv.findContours(binary, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_NONE)
n = len(coutours)  # 轮廓数量
coutoursImg = []  # 创建绘制轮廓列表
for i in range(n):
    temp = np.zeros(img1.shape, np.uint8)  # 把图像转换为矩阵
    coutoursImg.append(temp)  # 向列表追加矩阵信息
    # 绘制轮廓:drawContours()
    """绘制轮廓:drawContours()
    1、img2:等待绘制轮廓的图像
    2、coutours:要绘制的轮廓(与findContours()函数输出的coutours参数一致《list类型即:列表类型》)
    3、contourIdx:要绘制一条轮廓还是全部轮廓:如果参数是一个整数或者0表示绘制对应索引号的轮廓[如果是-1表示绘制全部轮廓]
    4、color:绘制颜色,用B,G,R格式表示
    5、thickness:表示绘制时的画笔粗细,如果为-1表示用实心绘制
    6、lineType:表示绘制线轮廓时的线形
    7、hierarchy:所输出的层次信息
    8、maxLevel:控制轮廓层次的深度(如果是0表示绘制地0层轮廓)
    9、offset:偏移参数使轮廓偏移一定位置用[ x , y ]坐标表示
    """
    # coutoursImg[i] = cv.drawContours(coutoursImg[i], coutours, i, (255, 255, 255), 3
    coutoursImg[i] = cv.drawContours(img1, coutours, i, (0, 255, 0), 3
                                     )
    if cv.contourArea(coutours[i]) > 1500:
        print("第" + str(i + 1) + "个图形的面积是:" + str(cv.contourArea(coutours[i])) + "个像素点")
        # cv.imshow("coutours[" + str(i) + "]", coutoursImg[i])
        # 创建窗口:'discern'为创建窗口的名字;0是为下一步设置窗口尺寸设置的
        cv.namedWindow('chulihou', 0)
        # 设置窗口尺寸,单位为Px(像素):'discern'为要设置尺寸的窗口
        cv.resizeWindow('chulihou', 500, 500)
        # 设置窗口位置
        cv.moveWindow("chulihou", 900, 200)
        cv.imshow("chulihou", img1)
# 键盘输入检测,参数为显示时长,如果参数为0就是键盘按下退出显示
cv.waitKey()
# 关闭所有窗口
cv.destroyAllWindows()

运行效果:

 

 

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

~RD XIAO Du

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值