zoukankan      html  css  js  c++  java
  • 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
    
  • 相关阅读:
    spring事件广播
    浏览器中文乱码,组合项目中部分模块乱码
    SpringSecurity加密Salt
    Linux服务器Java输出文件中文乱码
    重定向监听端口并持久化路由配置
    Mac下文件编码转换
    Shell之内容匹配与格式输出
    [leetcode]Scramble String
    [leetcode]Decode Ways
    [leetcode]Valid Palindrome
  • 原文地址:https://www.cnblogs.com/wojianxin/p/12610831.html
Copyright © 2011-2022 走看看