Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何优化凸包图形?_Python_Opencv_Optimization_Convex Hull - Fatal编程技术网

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)。如果值得,请继续阅读

    这将是我的最终输出:

  • 从第一张图像中找到所有“斑点”轮廓
  • 迭代“斑点”轮廓,并在单独的黑色背景上绘制每个轮廓,参见
  • 按位and(相交)此图像与第二个图像中的“细节”
  • 找到该交点内的所有“细节”轮廓
  • 只需连接“细节”等高线中的所有坐标,然后调用
  • 在一些输出图像上绘制凸包
  • 这就是完整的代码:

    导入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区域中的其他点)不幸的是,我不理解您的后续问题。也许,在那里详细描述你的问题,也许在这里参考进一步的上下文。