Python 如何优化凸包图形?
我试图在一些输入图像(下面的第二幅图像)中根据覆盖面积(见下面的第一幅图像)归档绘制凸包点。对于此操作,我将执行以下操作:Python 如何优化凸包图形?,python,opencv,optimization,convex-hull,Python,Opencv,Optimization,Convex Hull,我试图在一些输入图像(下面的第二幅图像)中根据覆盖面积(见下面的第一幅图像)归档绘制凸包点。对于此操作,我将执行以下操作: 在第一张图像中找到轮廓 在第二张图像中找到轮廓 对于第一幅图像中的每个轮廓区域,将其与第二幅图像中的所有轮廓进行比较,并检查它们是否在第一幅图像中的轮廓内。如果在等高线区域内,则将等高线的坐标添加到列表中 在列表中绘制凸面外壳点 我的问题是第三步花费了太多的时间,因为比较了第二张图像中的每个轮廓。有没有办法优化这段代码 对于coverContours中的coverConto
对于coverContours中的coverContours:
尝试:
点数=[]
对于pointsContours中的pointsContour:
((x,y,r)=cv2.MineConclosingCircle(pointsContour)
如果(cv2.PointPolyContest(coverContour,(int(x),int(y)),False))==1:
点列表追加((int(x),int(y)))
点附加(点(int(x),int(y)))
绘制点=点。凸面外壳(点,透镜(点))
对于范围内的x(透镜(牵引点)-1):
cv2.线(图层,(点[draw\u point[x]].x,点[draw\u point[x]].y),
(点[draw_point[x+1]].x,点[draw_point[x+1]].y),(255,255,255),线厚度)
cv2.线(图层,(点[draw_点[len(draw_点)-1]].x,点[draw_点[len(draw_点)-1].y),
(点[draw_point[0]].x,点[draw_point[0]].y,(255,255,255),线[u厚度)
除:
打印(“”)
封面图片:
输入图像:
最终图像:
我没有测试你的代码,因为它缺少现成的部分,所以我不知道如何量化在这里花费的时间太多。下面提到的方法在我的机器上大约需要50毫秒(i7 3.60 GHz,32 GB RAM)。如果值得,请继续阅读 这将是我的最终输出:
导入cv2
将numpy作为np导入
#读取输入图像
blobs=cv2.imread('6Sh0t.png',cv2.imread_灰度)
详细信息=cv2.imread('RdKkN.png',cv2.imread_灰度)
#使用OpenCV版本查找水滴轮廓
cnt_blobs=cv2.查找对象(blobs,cv2.RETR_外部,cv2.链约无)
如果len(cnt_blobs)==2,则cnt_blobs=cnt_blobs[0]
#准备输出图像
输出=np.类零(BLOB)
#迭代所有斑点轮廓
对于cnt_blob中的cnt:
#在空的黑色背景上绘制水滴轮廓
tmp=np.类零(斑点)
tmp=cv2.绘制轮廓(tmp,[cnt],-1255,cv2.填充)
#带细节的逐位和(相交)水滴轮廓
tmp=cv2.按位_和(tmp,详细信息)
#在OpenCV版本中查找交叉点w.r.t.内的详细轮廓
cnts=cv2.找到的容器(tmp、cv2.RETR\u外部、cv2.CHAIN\u近似无)
如果len(cnts)==2个其他cnts[1],则cnts=cnts[0]
#连接所有坐标,并获得凸包
cnts=np.连接(cnts,轴=0)
cnts=cv2.convexHull(cnts)
#吸收输出
输出=cv2。绘制轮廓(输出,[CNT],-1128,3)
#输出
cv2.imshow(“输出”,输出)
cv2.等待键(0)
cv2.destroyAllWindows()
----------------------------------------
系统信息
----------------------------------------
平台:Windows-10-10.0.16299-SP0
Python:3.8.5
努比:1.19.5
OpenCV:4.5.1
----------------------------------------
你真棒,谢谢。我再问你一个问题。有没有简单的方法可以画一条线到同一个水滴区域的每个点(轮廓)?(我试图将每个点连接到同一blob区域中的其他点)不幸的是,我不理解您的后续问题。也许,在那里详细描述你的问题,也许在这里参考进一步的上下文。