Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.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 OpenCV尝试分割轮廓或在一个轮廓中查找两个最底点_Python_C++_Opencv - Fatal编程技术网

Python OpenCV尝试分割轮廓或在一个轮廓中查找两个最底点

Python OpenCV尝试分割轮廓或在一个轮廓中查找两个最底点,python,c++,opencv,Python,C++,Opencv,我正在使用openCV(在Python上)并尝试执行一项简单的任务。我有这个人体轮廓,我需要在他的每个半身上找到最底部的点(所以,基本上,腿最底部的点。我在图片上把它们抬高了),我只是不知道怎么做 有没有办法把等高线一分为二?还是有更简单的方法 谢谢 我会根据轮廓点的y坐标(首先是最低点)对轮廓点进行排序。以第一个点为例,假设它是一条腿最底部的点。现在浏览此序列中的其他点,并检查连接第一个点的线是否满足此条件: 至少(比如)50%的点不是轮廓的一部分 这条线本身至少有(比如)30像素长 接

我正在使用openCV(在Python上)并尝试执行一项简单的任务。我有这个人体轮廓,我需要在他的每个半身上找到最底部的点(所以,基本上,腿最底部的点。我在图片上把它们抬高了),我只是不知道怎么做

有没有办法把等高线一分为二?还是有更简单的方法


谢谢

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

  • 至少(比如)50%的点不是轮廓的一部分
  • 这条线本身至少有(比如)30像素长
接受第一个事实


这应该会给你一个位于另一条腿上的点,并且是最底部的点。

首先,你要反转图像上的颜色,然后处理反转后的图像。您可以按照描述的方式来实现这一点

我刚刚编写了一些代码,似乎成功地检测到了反转图像上每条腿的底部。简而言之,我所做的是访问轮廓数组中的每个元素,并找到最大(出于某种原因)y值。从那里,很容易得到相关的x值,并在这些坐标处画圆。在绘制圆之前,可以使用阈值、平滑度等。注意:您需要指定反转图像的路径。下面是实现这一点的代码(它确实杂乱无章,我只是拼凑了这个AQAP,这样你就可以开始了):

class test():
定义初始化(自):
cv2.namedWindow(“w1”,cv.cv\u窗口\u自动调整大小)
cv2.createTrackbar('Threshold','w1',100225,self.passdef)
cv2.createTrackbar('Smoothen','w1',15,24,self.passdef)
cv2.createTrackbar('Brightness','w1',50,100,self.passdef)
cv2.createTrackbar('Contrast','w1',0100,self.passdef)
self.vid_轮廓_选择()
def passdef(自我,x):
通过
def视频轮廓选择(自):
尽管如此:
self.t1=cv2.getTrackbarPos('Threshold','w1')
self.gb1=cv2.getTrackbarPos('Smoothen','w1')
bright=cv2.getTrackbarPos('bright','w1')
对比度=cv2.getTrackbarPos('contrast','w1')
c=浮动(对比度)/100
b=浮动(明亮)/100
im=cv2.imread('/home/rm/invertida.png')
aframe=numpy.asarray(im[:,:])
g=cv.fromarray(一帧)
如果self.gb1!=0:
cv.光滑(g,g,cv.cv_GAUSSIAN,self.gb1,15)
g=numpy.asarray(g)
imgray=cv2.CVT颜色(g,cv2.COLOR\U BGR2GRAY)
ret,thresh=cv2.threshold(imgray,self.t1225,cv2.thresh#u二进制)#鼠标悬停在菌落上以查看val
threshbgr=cv2.CVT颜色(thresh,cv.cv_GRAY2BGR)
轮廓,层次=cv2.查找轮廓(阈值,cv.cv_RETR_外部,cv2.链_近似_简单)或cv_RETR_列表
self.ctrs=[]
对于等高线中的i:
如果cv2.contourArea(i)<150000且cv2.contourArea(i)>500:
self.ctrs.append(一)
ally=[]
对于self.ctrs中的i:
对于i中的q:
对于q中的p:
ally.append(p[1])
ally.sort()
米尼=盟友[-1]
miny2=miny
计数=-2
而miny2==miny:
miny2=盟友[计数]
计数-=1
对于self.ctrs中的i:
对于i中的q:
对于q中的p:
如果p[1]==miny:
科尔达=(p[0],米尼)
如果p[1]==miny2:
cordb=(p[0],miny2)
cv2.圆(threshbgr,corda,20,颜色=(0,0225),厚度=2)
cv2.圆(阈值bgr,cordb,20,颜色=(0,0225),厚度=2)
cv2.等高线图(threshbgr,自中心-1,(0225,0),2)
cv2.imshow(“w1”,阈值BGR)
c=cv2.等待键(5)
p=测试()

对格式设置表示歉意-您必须缩进下面的所有内容
class test()

您是否可以尝试用cv2调用替换不推荐的cv api调用?(opencv3即将推出,它不允许您使用)我忘记了代码顶部的
import
语句(现在它们就在那里)。我正在将cv2导入为cv。这就是你的意思吗?不完全是(那种阴影是个坏主意)。e、 g.cv2.namedWindow vs.cv.namedWindow-仍然是一个令人大开眼界的问题吗?您认为“将cv2作为cv导入”将使用cv2 api,但事实并非如此
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()