• 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
    
  • 相关阅读:
    [LeetCode]*124.Binary Tree Maximum Path Sum
    HDU3336-Count the string(KMP)
    各种配置环境变量总结
    数据结构与算法-为什么要使用算法
    request 对象
    Codeforces 15B Laser
    使用jq工具在Shell命令行处理JSON数据
    Android中的FrameLayout帧布局
    iOS 8 设置导航栏的背景颜色和背景图片
    Creating HTML table with vertically oriented text as table header 表头文字方向
  • 原文地址:https://www.cnblogs.com/wojianxin/p/12610831.html
Copyright © 2020-2023  润新知