问题

我正在开发一个项目,我需要获得像形状一样的dumbell边界框.但是,我需要尽可能少的点,并且盒子需要适合所有角落的形状.这是我测试的图像:Blurry, cracked, dumbell shape

我不关心形状的间隙,我只想清理它,并将边缘拉直,这样我就可以得到这样的形状轮廓:Cleaned up

我一直在尝试阈值()它,使用findContours()获取它的轮廓,然后使用approxPolyDP()来简化轮廓最终的疯狂点数.所以,在摆弄了这个约三天之后,我怎么能简单地得到:

>两个框指定哑铃的末端和中间的矩形,或

>一个轮廓,所有角落都有十二个点

第二种选择是首选,因为这确实是我的最终目标:获得那些角落的点数.

有几点需要注意:

>我正在使用OpenCV for Python

>输入图像中通常会有许多这些形状的所有尺寸

>它们只有水平或垂直定位.没有奇怪的27度角……

我需要的:

我真的不需要有人为我编写代码,我只需要一些方法或算法来完成这项工作,最好是用一些简单的例子.

我的守则

这是我过于干净的代码,其中包含我甚至不使用的函数,但我最终会使用它们:

import cv2

import numpy as np

class traceImage():

def __init__(self, imageLocation):

self.threshNum = 127

self.im = cv2.imread(imageLocation)

self.imOrig = self.im

self.imGray = cv2.cvtColor(self.im, cv2.COLOR_BGR2GRAY)

self.ret, self.imThresh = cv2.threshold(self.imGray, self.threshNum, 255, 0)

self.contours, self.hierarchy = cv2.findContours(self.imThresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

def createGray(self):

self.imGray = cv2.cvtColor(self.im, cv2.COLOR_BGR2GRAY)

def adjustThresh(self, threshNum):

self.ret, self.imThresh = cv2.threshold(self.imGray, threshNum, 255, 0)

def getContours(self):

self.contours, self.hierarchy = cv2.findContours(self.imThresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

def approximatePoly(self, percent):

i=0

for shape in self.contours:

shape = cv2.approxPolyDP(shape, percent*cv2.arcLength(shape, True), True)

self.contours[i] = shape

i+=1

def drawContours(self, blobWidth, color=(255,255,255)):

cv2.drawContours(self.im, self.contours, -1, color, blobWidth)

def newWindow(self, name):

cv2.namedWindow(name)

def showImage(self, window):

cv2.imshow(window, self.im)

def display(self):

while True:

cv2.waitKey()

def displayUntil(self, key):

while True:

pressed = cv2.waitKey()

if pressed == key:

break

if __name__ == "__main__":

blobWidth = 30

ti = traceImage("dumbell.png")

ti.approximatePoly(0.01)

for thresh in range(127,256):

ti.adjustThresh(thresh)

ti.getContours()

ti.drawContours(blobWidth)

ti.showImage("Image")

ti.displayUntil(10)

ti.createGray()

ti.adjustThresh(127)

ti.getContours()

ti.approximatePoly(0.0099)

ti.drawContours(2, (0,255,0))

ti.showImage("Image")

ti.display()

代码说明

我知道我可能不会在这里做一些事情,但是嘿,我为此感到自豪:)

因此,我的想法是这些哑铃中经常有孔和间隙,因此我想如果我遍历所有阈值从127到255并将轮廓绘制到具有足够厚度的图像上,则绘制的厚度为轮廓将填充任何足够小的孔,我可以使用新的,blobby图像来获得边缘,然后将边缩回到尺寸.这是我的想法.尽管如此,还有另一种更好的方式……

摘要

我想得到12分;一个形状的每个角落.

编辑:

在尝试了一些侵蚀和扩张之后,似乎最好的选择是在某些点处切割轮廓,然后在切片形状周围使用边界框来获得正确的四四方角,然后进行一些计算以将盒子重新加入一个形状.一个相当有趣的挑战……

编辑2:

我发现了一些效果很好的东西!我制作了自己的线检测系统,只检测水平或垂直线,然后在检测到的线/轮廓边缘,程序绘制一条延伸到整个图像的黑线,从而有效地切割图像的直线.轮廓.一旦它这样做,它会获得切片盒的新轮廓,在片段周围绘制边界框,然后使用扩张来封闭间隙.到目前为止,它适用于大型形状,但是当形状很小时,它往往会失去一些形状.

所以,在摆弄了侵蚀,扩张,关闭,打开和看直线轮廓之后,[email protected]@ a.alsram!你的两个想法结合起来帮助我找到了解决方案.所以这是它的工作原理.

方法

程序迭代每个轮廓,并遍历轮廓中的每对点,寻找位于同一轴上的点对并计算它们之间的距离.如果距离大于可调阈值,则程序确定这些点被视为形状上的边缘.然后程序使用该边缘,沿整个轮廓绘制一条黑线,从而切割该边缘的轮廓.然后程序重新确定轮廓,因为形状被切断.被切断的这些碎片知道它们自己的轮廓,然后由边界框界定.最后,所有形状都被扩张和侵蚀(接近)以重新加入被切断的盒子.

这种方法可以多次完成,但每次都有一点精度损失.但它适用于我需要的东西,当然是一个有趣的挑战!谢谢你的帮助!

natebot13

python凹多边形分割_在Python中OpenCV多边形的凹凸角点相关推荐

  1. python凹多边形分割_使用Opencv python从Image中裁剪凹面多边形

    Steps find region using the poly points create mask using the poly points do mask op to crop add whi ...

  2. python 时间序列预测_使用Python进行动手时间序列预测

    python 时间序列预测 Time series analysis is the endeavor of extracting meaningful summary and statistical ...

  3. python 概率分布模型_使用python的概率模型进行公司估值

    python 概率分布模型 Note from Towards Data Science's editors: While we allow independent authors to publis ...

  4. python图片字符分割_图像分割python

    常用的十大 python 图像处理工具 本文为 AI 研习社编译的技术博客,原标题 : 10 Python image manipulation tools. 作者 | Parul Pandey 翻译 ...

  5. python 语料标注_在python中怎么标记文本?

    要运行下面的python程序,必须在系统中安装(NLTK)自然语言工具包. NLTK模块是一个庞大的工具包,旨在帮助您使用整个自然语言处理(NLP)方法. 要安装NLTK,请在终端中运行以下命令.su ...

  6. python文本筛选_使用python对多个txt文件中的数据进行筛选的方法

    使用python对多个txt文件中的数据进行筛选的方法 一.问题描述 筛选出多个txt文件中需要的数据 二.数据准备 这是我自己建立的要处理的文件,里面是随意写的一些数字和字母 三.程序编写 impo ...

  7. python selenium 下拉列表_从下拉列表中选择python selenium选项

    我试图使用下面的代码使用selenium(python)从网页上的下拉列表中选择一个选项.在from selenium import webdriver from selenium.webdriver ...

  8. python pipeline框架_介绍Python的Django框架中的静态资源管理器django-pipeline

    django-pipeline 是一个 Django 下非常方便的静态资源管理 app,尤其是 1.2 版本之后,利用 django-staticfiles 的collectstatic 命令,在开发 ...

  9. python中立方表示_在Python中表示一个对象的方法

    在 Python 中一切都是对象.如果要在 Python 中表示一个对象,除了定义 class 外还有哪些方式呢?我们今天就来盘点一下. 0x00 dict 字典或映射存储 KV 键值对,它对查找.插 ...

  10. python临床数据_从临床试验中获取数据

    我正在开发一个小Python函数来从clinicalTrials.gov中获取数据.从每个研究记录中,我想从中找出研究的目标条件.例如,对于this研究记录,我需要以下内容:conditions = ...

最新文章

  1. plt.figure()各参数使用
  2. CDataBaseEngineSink::OnRequestPlatformParameter 数据库异常:查询超时已过期 [ 0x80040e31 ]...
  3. Redis集群架构搭建详解
  4. Silverlight学习(一) 创建Silverlight项目,构建一个简单的Silverlight Demo
  5. 安卓手机开机键失灵,FASTBOOT模式ADB重启
  6. 鸿蒙安卓数据互通吗,假如鸿蒙与安卓之间不能够实现游戏账号互通,你还会为其买单吗?...
  7. MySQL命令梳理_MySQL操作命令梳理(2)
  8. codeforces 816 B. Karen and Coffee(思维)
  9. LeetCode_database刷题记录(595. 大的国家)
  10. 【渝粤教育】广东开放大学 建筑设备 形成性考核 (33)
  11. Discuz!NT3.0博客扩展
  12. cesium-相机系统
  13. 获取KVM虚拟机IP地址
  14. 怎么根据分隔符号将Excel数据换行复制
  15. Advanced Algorithm 听课笔记(Useful Inequalities Balls and Bins)
  16. PC浏览器如何设置代理
  17. Windows Sever 2012 R2 组策略将everyone权限应用于匿名用户
  18. pageX,pageY,screenX,screenY,clientX,和clientY,offsetX ,offsetY,layerX,layerY的使用 和 区别
  19. 【蓝桥杯历年真题合集】蓝桥杯2020初赛
  20. 序列化Serializable serialVersionUID的作用

热门文章

  1. java poi 创建ppt图表,柱状图
  2. 模块七:mixer模块
  3. c语言 n是什么作用,“\n\n”在c语言中是什么意思?
  4. Fiddler 移动端/模拟器安装证书
  5. [转]多CLIENT的SCC4设置
  6. iPhone所有屏幕分辨率
  7. 手把手教你安装JDK免安装版(简单粗暴)
  8. 软件著作权申请步骤流程
  9. Android单元测试 - 如何开始?
  10. 通过lan从服务器启动系统,OPNsense启用LAN网桥