Scipy 和opencv 计算凸包(convexHull)

2023-05-16

凸包:在数学中,在实向量空间V中的一组点X的凸包或凸包络是包含X的最小凸集。来自Wikipedia。通俗的来说就是包围一组散点的最小凸边形。

scipy.spatial opencv 分别有计算凸包的函数,scipyconvexHull输入的参数可以是m*2的点坐标。其返回值的属性.verticess是所有凸轮廓点在散点(m*2)中的索引值。

注意:属性.verticess绘制出来的轮廓点是按照逆时针排序

opencv 中,cv2.convexHull可以得到凸包的坐标值/凸包在轮廓的索引值(取决于参数returnPoints=True/Fasle)。同时opencvconvexityDefects函数可计算凸缺陷,即使图像中所有的凹点。其函数返回值是m*4的数组,第一列是起点,第二列是终点,第三列是最远点,第四列是最远点到凸轮廓的距离。

图像的质心----利用图像矩,opencv--- cv2.moments(轮廓)

其中 cx = int(M['m10']/M['m00'])y = int(M['m01']/M['m00'])

Scipy 计算得到的凸包见下图:

Opencv计算凸包:

本次测试图为:

注意:本测试图阈值化的时候注意反转图像,牢记找轮廓是针对的“白像素”

反转和不反转后的图

寻找轮廓函数详解:

cv2.findContours(thresh,0,2)

参数:第一个输入的是binary_image

第二个参数:RetrievalModes

 cv::RETR_EXTERNAL = 0, 外部轮廓用的比较多
  cv::RETR_LIST= 1,
  
cv::RETR_CCOMP= 2,
  
cv::RETR_TREE= 3,
  
cv::RETR_FLOODFILL= 4

第三个参数:ContourApproximationModes

  cv::CHAIN_APPROX_NONE = 1, 轮廓所有点
  cv::CHAIN_APPROX_SIMPLE = 2,
只返回四角的点
  cv::CHAIN_APPROX_TC89_L1= 3,
  
cv::CHAIN_APPROX_TC89_KCOS= 4

轮廓寻找完成后,找出轮廓面积最大的轮廓作为计算凸包的当前轮廓。注意:cnt_max的大小是m*1*2

最终结果图:----凸缺陷检测出来的点(红色点),有一处错误.

程序如下:
# -*- coding: utf-8 -*-
import cv2
import matplotlib.pyplot as plt
import numpy as np
from scipy.spatial import ConvexHull
##########scipy 凸包################
points = np.random.rand(30, 2)
hull = ConvexHull(points)
plt.plot(points[:,0], points[:,1], 'o')
# hull.vertices 得到凸轮廓坐标的索引值,逆时针画
hull1=hull.vertices.tolist()#要闭合必须再回到起点[0]
hull1.append(hull1[0])
plt.plot(points[hull1,0], points[hull1,1], 'r--^',lw=2)
for i in range(len(hull1)-1):
    plt.text(points[hull1[i],0], points[hull1[i],1],str(i),fontsize=20)
########cv2#########
im=cv2.imread(r"C:\Users\Y\Desktop\star.jpg")
im_gray=cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
_,thresh=cv2.threshold(im_gray,0,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
_,cnts,h=cv2.findContours(thresh,0,1)
area=[]
for c in cnts:
    area.append(cv2.contourArea(c))
cnt_max=cnts[np.argsort(-np.array(area))[0]]
hull_cv=cv2.convexHull(cnt_max)
cv2.drawContours(im,[hull_cv],0,(0,0,255),2)
#####寻找凸缺陷********
hull_index=cv2.convexHull(cnt_max,returnPoints = False)
defects = cv2.convexityDefects(cnt_max,hull_index)
for i in range(defects.shape[0]):
    s,e,f,d=defects[i,0]
    far = tuple(cnt_max[f][0])
    cv2.circle(im,far,5,(0,0,255),-1)
##########确定重心###########
#计算图像矩
M=cv2.moments(cnt_max)
cx=M["m10"]/M["m00"]
cy=M["m01"]/M["m00"]
cv2.circle(im,(np.float32(cx),np.float32(cy)),5,(255,0,0),-1)
cv2.putText(im,"center",(np.float32(cx),np.float32(cy)),cv2.FONT_HERSHEY_SIMPLEX,1,(0,255,0),3)
cv2.imshow("tu",im),cv2.waitKey(0)

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Scipy 和opencv 计算凸包(convexHull) 的相关文章

  • Pyinstaller“无法执行脚本 pyi_rth_pkgres”并且缺少软件包

    这是我第一次在这里发布问题 因为我的大部分问题已经被其他人回答了 我正在 python 中开发 GUI 应用程序 并尝试使用 pyinstaller 将其打包到单个文件夹和 exe 中 以便于移植 目前 我使用 Windows 10 和 a
  • 如何使用Java OpenCV

    我正在使用图像处理开始我的最后一年项目 并希望完成类似的事情this http www youtube com watch v EPai5f2sWaA 它是人体和物体检测的结合 我真的很想用 Java 来做 因为我在 C 方面的经验很少 I
  • 如何使用 python 测量骨架长度的想法

    After applying skeletonization http scikit image org docs dev auto examples plot skeleton html on an image 我想使用 python 测
  • OpenCV 完美识别物体

    我有一个应用程序 我想一次跟踪 2 个在图片中相当小的对象 该应用程序应该在 Android 和 iPhone 上运行 因此算法应该是高效的 对于我的客户来说 如果我们提供一些模式以及附加到要跟踪的对象的软件 以获得易于识别的目标 那就完全
  • 在 Android 中使用 OpenCV 查找图像匹配

    我正在尝试构建一个 Android 应用程序 该应用程序可以比较设备相机拍摄的照片 以在一组图像中找到匹配项 我已经在 Android Studio 上配置了 OpenCV 但仅此而已 有人可以通过链接到资源或建议教程来提供帮助吗 Open
  • PIL/scipy.misc 中的 imresize 仅适用于 uint8 图像?有什么替代方案吗?

    看来imresize实施于PIL scipy misc仅适用于 uint8 图像 gt gt gt import scipy misc gt gt gt im np random rand 100 200 gt gt gt print im
  • OpenCV,捕获的视频比原始相机视频运行得更快!

    我正在使用 openCV 从相机捕获视频并将其存储到 avi 文件 问题是当我完成捕获并运行 avi 文件时 视频流看起来速度很快 这是代码 void main CvCapture capture cvCaptureFromCAM 0 in
  • ValueError:当数组不是序列时设置带有序列的数组元素

    您好 此代码旨在存储使用 open cv 绘制的矩形的坐标 并将结果编译为单个图像 import numpy as np import cv2 im cv2 imread 1 jpg im3 im copy gray cv2 cvtColo
  • 拟合泊松直方图

    I am trying to fit a curve over the histogram of a Poisson distribution that looks like this 我修改了拟合函数 使其类似于泊松分布 其中参数 t 作
  • 使用 scipy.stats 计算条件期望

    假设 x Poisson 2 5 我想计算类似 E x x gt 2 的东西 我认为这可以通过 dist expect 运算符来完成 即 D stats poisson 2 5 cond expect D dist expect lambd
  • 将人员分配到床位 - 自动化方法[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我每年都会帮助举办青年营 将与会者分配到卧室是一项艰巨的任务 有 92 个卧室 活动持续一周 与会者停留的时间长短不一 而且床需要重复
  • 如何在 OpenCV 中将 Float Mat 写入文件

    我有一个矩阵 Mat B 480 640 CV 32FC1 包含浮点值 我想将此矩阵写入一个可以打开的文件Notepad https en wikipedia org wiki Windows Notepad or 微软Word https
  • VideoCapture 未检测到 uEye 摄像头

    我的 uEye 相机遇到了一个问题 使用我的笔记本电脑摄像头 id 0 或 USB 上的网络摄像头 id 1 此行完美运行 TheVideoCapturer open 1 TheVideoCapturer 属于 VideoCapture 类
  • Python 多元简单线性回归

    注意这是not关于多元回归的问题 这是一个关于在 Python NumPy 2 7 中多次进行简单 单变量 回归的问题 我有两个m x n arrays x and y 这些行彼此对应 每对都是用于测量的 x y 点的集合 那是 plt p
  • 用给定均值截断正态分布

    python 是否可以生成具有给定期望值的截断正态分布 我知道 scipy stats truncnorm 可以给出截断的正态分布 该分布取平均值original正态分布作为参数 但我想创建一个截断正态分布 使得截断分布的期望值是一个特定值
  • 在 scipy.stats 中,rv_continuous 有一个 fit 方法来查找 MLE,但 rv_discrete 没有。为什么?

    我想找到一些可能受离散分布控制的数据的最大似然估计 但在 scipy stats 中 只有表示连续分布的类才具有拟合函数来执行此操作 代表离散分布的类不具有离散分布的原因是什么 简短的回答 因为据我所知 没有人为其编写代码 甚至没有人尝试过
  • Android API人脸检测与OpenCV/JavaCV人脸检测

    我在 Android 设备上使用了本地 Android 人脸检测 但它似乎很慢 而且我不太确定其可靠性 我还使用了 OpenCV 的人脸检测 但仅限于 PC 而不是 Android 设备 对于 Android 我猜我必须使用 JavaCV
  • 如何将 OpenCV 的测试框架与 CMake 结合使用?

    好像 OpenCV 有一个测试框架 https github com Itseez opencv tree ef91d7e8830c36785f0b6fdbf2045da48413dd76 modules ts include opencv
  • 有效积累稀疏 scipy 矩阵的集合

    我有一个 O N NxN 的集合scipy sparse csr matrix 每个稀疏矩阵都有 N 个元素集 我想将所有这些矩阵加在一起以获得一个常规的 NxN numpy 数组 N 约为 1000 矩阵内非零元素的排列使得所得总和肯定不
  • 使用 openCV 对图像中的子图像进行通用检测

    免责声明 我是计算机视觉菜鸟 我看过很多关于如何在较大图像中查找特定子图像的堆栈溢出帖子 我的用例有点不同 因为我不希望它是具体的 而且我不确定如何做到这一点 如果可能的话 但我感觉应该如此 我有大量图像数据集 有时 其中一些图像是数据集的

随机推荐

  • ArduPilot-sitl中的一些操作记录

    ArduPilot 这么优秀的代码 提供了一套很方便的SITL仿真开发模式 在git clone代码的时候 已经将相关的东西下载下来了 问题是如何进行使用 首先要安装mavproxy 这个软件 pymavlink mavlink封装的pyt
  • 烧写自定义ArduPilot到自定义的开发板

    写在前面的话 xff1a 本篇章内容参看 怒飞垂云 的资料 将APM固件移植到自制硬件 实际操作过程中 xff0c 需要如下几个步骤 xff1a 先在ardupilot中的 waf distclean 完成清理 xff0c 主要删除了bui
  • 跨域资源共享CORS的那些事(二)

    跨域资源共享CORS的那些事 xff08 二 xff09 最近在为高性能开源API网关apisix写跨域插件 xff0c 发现该功能对协议要求要比较熟悉 xff0c 借此机会重新复习下跨域协议 xff0c 以及简要写下跨域功能的设计 文章目
  • 宅家学习,如何进行Kubernetes Ingress控制器的技术选型?

    导语 xff1a 在Kubernetes的实践 部署中 xff0c 为了解决 Pod 迁移 Node Pod 端口 域名动态分配等问题 xff0c 需要开发人员选择合适的 Ingress 解决方案 面对市场上众多Ingress产品 xff0
  • Linux下connect()函数的错误代码对应含义

    Linux下connect 函数的错误代码对应含义 windows和linux下的connect系统接口有自己的一套返回码以及返回含义 Linux EBADF xff1a 参数socket未指定一个合法的描述符ENOTSOCK 参数sock
  • git设置用户名密码

    git设置用户名密码 设置git用户名 xff0f 邮箱 span class hljs comment git span span class hljs comment config span span class hljs litera
  • 'python' 不是内部或外部命令,也不是可运行的程序或批处理文件。

    python 不是内部或外部命令 xff0c 也不是可运行的程序或批处理文件 我将python安装在D盘之后 xff0c 输入python xff0c 显示如下问题 span class hljs keyword D span gt pyt
  • git pull时遇到error: cannot lock ref 'xxx': ref xxx is at (一个commitID) but expected的解决办法

    git pull时遇到error cannot lock ref xxx ref xxx is at xff08 一个commitID xff09 but expected的解决办法 在执行git pull时遇到如下错误 xff1a spa
  • tar.gz和tar.bz2解压命令

    tar gz和tar bz2解压命令 网络上下载到linux源码包主要是tar gz和tar bz2压缩格式的 xff0c 有一部分是zip 解压tar gz命令是 tar zxvf xx tar gz 解压tar bz2的命令是 tar
  • 使用VS CODE+PlantUML高效画图

    使用VS CODE 43 PlantUML高效画图 自从发现了plantuml写脚本画图的方式之后 xff0c 爱上了画图 环境 xff1a MAC 前言 本文多数内容引用自官网文档和其他人的教程 xff0c 并非本人原创 xff0c 也谈
  • CMake多工程最小实现

    背景 xff1a 最近团队的新项目开始基于CMake作为工程管理 xff0c 结合VSCode作为IDE进行开发 xff0c 一个原因当然是为了可支持跨平台 原来我们的开发环境是使用VS系列IDE进行开发 xff0c 在底层框架完全改为CM
  • c++ aggregate 'std::stringstream ss' has incomplete type and cannot be defined

    c 43 43 aggregate std stringstream ss has incomplete type and cannot be defined 这个问题是使用了stringstream这个类 xff0c 但没有包含头文件ss
  • 阿里巴巴的“达摩院”,必是一场闹剧

    阿里巴巴的 达摩院 xff0c 必是一场闹剧 今天上午 xff0c 阿里巴巴成立 达摩院 xff0c 引入顶尖科学家3年研发投入将超千亿 的文章在网上刷屏了 在我看来 xff0c 马云在挑战科技规律 xff0c 这必是一场闹剧 前几年 xf
  • 一种解耦非线性优化的高效VI-SLAM系统-Snake-SLAM

    摘要 Snake SLAM 是一种可在低功率航空设备上稳定运行的VI SLAM 自主导航系统 跟踪前端具有地图复用 闭环 重定位功能 xff0c 并支持单目 立体和 RGBD 输入 该系统通过图论算法来减少关键帧并提出一种 延时地图 的方法
  • 关于视觉三维重建colmap 一期课程,我想说点什么

    为什么开colmap这门课 2019年硕士毕业进入驭势科技从事高精度地图算法职位 xff0c 闲暇时间便开启自己在B站上分享技术的历程 xff0c 如下早期视频 xff1a 但是发完这几次视频后 xff0c 发现每次录制的时候总会遗漏自己想
  • 关于视觉重定位(VPS)的工作经验分享

    在AR领域也呆了不短时间了 xff0c 也一直在做视觉定位相关的工作 xff0c 这里分享一下有意思的工作方向 xff0c 感兴趣的可以讨论或者联系我即可 首先简单区分AR和VR的区别 xff0c VR 属于虚拟现实 xff0c 即是由实入
  • python调用百度地图API 实现单点沿线轨迹运动

    百度地图API 可以做很多好玩的事情 xff0c 自己闲来无事 xff0c 先是照着一些资料做了热力图 xff0c 然后借助pyqt5做了一个简单的界面 xff0c 实现gps单点沿线 xff08 行车 xff09 的轨迹 先上程序界面和效
  • python 在测绘作业中的一些小应用(与cad交互)-1

    虽然笔者已经基本上告别了本科的测绘工程专业 xff0c 但是笔者的本科同学他们在实际作业中难免会遇到一些批量化 重复性劳动问题 xff0c 如果会编程 xff0c 写上一个小脚本 xff0c 无疑会提高工作效率 下面是笔者本科同学处理测量数
  • 阴影检测(shadow detect)

    不管是无人机影像或者其它方式摄取的图像 xff0c 由于光照 xff0c 难免会存在阴影 xff0c 笔者这篇文章介绍检测阴影一种简单的方式 参考论文 xff1a 1 Damaged Building Detection in Aerial
  • Scipy 和opencv 计算凸包(convexHull)

    凸包 xff1a 在数学中 xff0c 在实向量空间 V 中的一组点 X 的凸包或凸包络是包含 X 的最小凸集 来自 Wikipedia 通俗的来说就是包围一组散点的最小凸边形 在 scipy spatial 和 opencv 分别有计算凸