python – OpenCV多边形的凹凸角点

python – OpenCV多边形的凹凸角点,第1张

概述问题 我正在开发一个项目,我需要获得像形状一样的dumbell边界框.但是,我需要尽可能少的点,并且盒子需要适合所有角落的形状.这是我测试的图像:Blurry, cracked, dumbell shape 我不关心形状的间隙,我只想清理它,并将边缘拉直,这样我就可以得到这样的形状轮廓:Cleaned up 我一直在尝试阈值()它,使用findContours()获取它的轮廓,然后使用approx 问题

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

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

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

>两个框指定哑铃的末端和中间的矩形,或
>一个轮廓,所有角落都有十二个点

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

有几点需要注意:

>我正在使用OpenCV for Python
>输入图像中通常会有许多这些形状的所有尺寸
>它们只有水平或垂直定位.没有奇怪的27度角……

我需要的:

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

我的守则

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

import cv2import numpy as npclass 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,threshNum,0)    def getContours(self):        self.contours,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)):        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:                breakif __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,0))    ti.showImage("Image")    ti.display()

代码说明

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

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

摘要

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

编辑:

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

编辑2:

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

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

方法

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

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

natebot13

总结

以上是内存溢出为你收集整理的python – OpenCV多边形凹凸角点全部内容,希望文章能够帮你解决python – OpenCV多边形的凹凸角点所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1196866.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存