• opencv 凸包讲解及绘制


    凸包讲解

    凸包跟多边形逼近很像,只不过它是物体最外层的”凸”多边形:集合A内连接任意两个点的直线都在A的内部,则称集合A是凸形的。如下图,红色的部分为手掌的凸包,双箭头部分表示凸缺陷(Convexity Defects),凸缺陷常用来进行手势识别等:
    图解凸包和凸缺陷

    opencv中凸包函数

    # cnt:轮廓;hull:返回的凸包的角点坐标;reuturnPoints=True:代表返回角点的x/y坐标
    hull = cv.convexHull(cnt, returnPoints=True)
    

    绘制凸包

    import cv2 as cv
    import numpy as np
    
    # 凸包
    # 1.先找到轮廓
    img = cv.imread('convex.jpg', 0)
    _, thresh = cv.threshold(img, 0, 255, cv.THRESH_BINARY + cv.THRESH_OTSU)
    contours, hierarchy = cv.findContours(thresh, 3, 2)
    cnt = contours[0]
    
    # 2.寻找凸包,得到凸包的角点
    hull = cv.convexHull(cnt)
    
    # 3.绘制凸包
    image = cv.cvtColor(img, cv.COLOR_GRAY2BGR)
    cv.polylines(image, [hull], True, (0, 0, 255), 2)
    
    cv.imshow('convex hull', image)
    cv.waitKey(0)
    cv.destroyAllWindows()
    

    实验用图
    绘制凸包结果
    其中函数 cv.convexHull() 有个可选参数returnPoints,默认是True,代表返回角点的x/y坐标;如果为False的话,表示返回轮廓中是凸包角点的索引,比如说:

    print(hull[0])  # [[362 184]](坐标)
    hull2 = cv.convexHull(cnt, returnPoints=False)
    print(hull2[0])  # [510](cnt中的索引)
    print(cnt[510])  # [[362 184]]
    

    当使用 cv.convexityDefects() 计算凸包缺陷时,returnPoints需为False。

    判断轮廓是否是凸形的

    print(cv.isContourConvex(hull))  # True
    
  • 相关阅读:
    优化算法-BFGS
    Go语言及Web框架Beego环境无脑搭建
    使用WCF扩展记录服务调用时间
    红黑树LLRB
    springmvc国际化 基于请求的国际化配置
    Adapter Pattern
    泡泡屏保
    使用WCF扩展在方法调用前初始化环境
    OAuth的一个.NET开源实现
    Google C++编程风格指南
  • 原文地址:https://www.cnblogs.com/wojianxin/p/12610831.html
一二三 - 开发者的网上家园