繁体   English   中英

OpenCV尝试分割轮廓或在一个轮廓中找到两个最低点

[英]OpenCV trying to split contour or find two bottommost points in one contour

我正在使用openCV(在Python上)并尝试做一个简单的任务。 我具有人体轮廓,我需要在他的每个半边上找到最低点(因此,基本上是双腿的最低点。我将其高亮显示在图像上),我只是不知道该怎么做。

有什么办法将轮廓分成两半吗? 还是有更简单的方法?

轮廓

谢谢!

首先,您要反转图像上的颜色-然后使用该反转的图像。 您可以执行此处描述的操作来完成该任务。

我刚刚编写了一些代码,似乎可以成功检测到倒置图像上每条腿的底部。 简而言之,我要做的是访问轮廓数组中的每个元素并找到最大(出于某种原因)y值。 从那里,很容易获得关联的x值并在这些坐标处绘制圆。 您可以使用阈值,平滑度等玩法,直到绘制出圆圈。 注意:您需要指定反转图像的路径。 这是执行此操作的代码(它实际上是杂乱无章且杂乱无章的,我只是将AQAP拼凑在一起,以便您可以开始使用):

class test():
def __init__(self):
    cv2.namedWindow("w1", cv.CV_WINDOW_AUTOSIZE)
    cv2.createTrackbar('Threshold', 'w1', 100, 225, self.passdef)
    cv2.createTrackbar('Smoothen', 'w1', 15, 24, self.passdef)
    cv2.createTrackbar('Brightness', 'w1', 50, 100, self.passdef)
    cv2.createTrackbar('Contrast', 'w1', 0, 100, self.passdef)

    self.vid_contour_selection()


def passdef(self, x):
    pass        

def vid_contour_selection(self):


  while True:

      self.t1 = cv2.getTrackbarPos('Threshold', 'w1')
      self.gb1 = cv2.getTrackbarPos('Smoothen', 'w1')
      bright = cv2.getTrackbarPos('Brightness', 'w1')
      contrast = cv2.getTrackbarPos('Contrast', 'w1')
      c = float(contrast)/100
      b = float(bright)/100

      im = cv2.imread('/home/rm/invertida.png')
      aframe = numpy.asarray(im[:,:])

      g = cv.fromarray(aframe)

      if self.gb1 != 0:
          cv.Smooth(g, g ,cv.CV_GAUSSIAN, self.gb1,15 )
      g = numpy.asarray(g)

      imgray = cv2.cvtColor(g,cv2.COLOR_BGR2GRAY)

      ret,thresh = cv2.threshold(imgray,self.t1,225, cv2.THRESH_BINARY) #mouseover colony to see val
      threshbgr = cv2.cvtColor(thresh, cv.CV_GRAY2BGR)
      contours, hierarchy = cv2.findContours(thresh,cv.CV_RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE) #or CV_RETR_LIST

      self.ctrs = []

      for i in contours:


          if cv2.contourArea(i) < 150000 and cv2.contourArea(i) >500:
              self.ctrs.append(i)


      ally = []


      for i in self.ctrs:

          for q in i:

              for p in q:

                  ally.append(p[1])

          ally.sort()

          miny = ally[-1]
          miny2 = miny
          count = -2
          while miny2 == miny:
              miny2  = ally[count]
              count -=1


      for i in self.ctrs:

          for q in i:


              for p in q:
                  if p[1] == miny:
                      corda = (p[0], miny)
                  if p[1] == miny2:
                      cordb = (p[0], miny2)


      cv2.circle(threshbgr, corda,20,color= (0,0,225),thickness= 2)
      cv2.circle(threshbgr, cordb,20,color= (0,0,225),thickness= 2)




      cv2.drawContours(threshbgr,self.ctrs,-1,(0,225,0),2)

      cv2.imshow("w1", threshbgr)
      c = cv2.waitKey(5)


p = test()

道歉的格式-您必须缩进class test()下面的所有内容。

我将根据其轮廓的y坐标对它们进行排序(最低点在前)。 首先,假设它是一条腿的最低点。 现在浏览此序列中的其他点,并检查连接第一个点的线是否满足以下条件:

  • 至少(例如)50%的点不属于轮廓;
  • 该行本身至少(例如)长30个像素。

接受第一点,这是对的。

这应该给您在另一端并且在最底端的一个点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM