首页 文章

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

提问于
浏览
2

我正在玩openCV(在Python上)并尝试做一个简单的任务 . 我有这个人体轮廓,我需要在他的每个半身上找到最低点(所以,基本上,腿最底点 . 我在图像上高举它们)我只是不知道如何做到这一点 .

有没有办法将轮廓分成两半?或者有更简单的方法吗?

contour

谢谢!

2 回答

  • 3

    首先,您想要反转图像上的颜色 - 然后使用反转的图像 . 您可以执行here所描述的内容来实现此目的 .

    我刚刚写了一些代码,似乎成功地检测到倒像上每条腿的底部 . 简而言之,我所做的是访问轮廓数组中的每个元素并找到最大值(由于某种原因)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() 以下的所有内容 .

  • 1

    我会根据它们的y坐标(最低点优先)对该轮廓的点进行排序 . 取第一点,假设它是一条腿的最底部点 . 现在浏览此序列中的其他点,并检查连接第一个点的线是否满足此条件:

    • 至少(比如说)50%的分数不是轮廓的一部分;

    • 线本身至少(比如说)30像素长 .

    接受这是真的第一点 .

    这应该给你一个在另一条腿上的点,并且是最底部的 .

相关问题