我正在玩openCV(在Python上)并尝试做一个简单的任务 . 我有这个人体轮廓,我需要在他的每个半身上找到最低点(所以,基本上,腿最底点 . 我在图像上高举它们)我只是不知道如何做到这一点 .
有没有办法将轮廓分成两半?或者有更简单的方法吗?
谢谢!
首先,您想要反转图像上的颜色 - 然后使用反转的图像 . 您可以执行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() 以下的所有内容 .
class test()
我会根据它们的y坐标(最低点优先)对该轮廓的点进行排序 . 取第一点,假设它是一条腿的最底部点 . 现在浏览此序列中的其他点,并检查连接第一个点的线是否满足此条件:
至少(比如说)50%的分数不是轮廓的一部分;
线本身至少(比如说)30像素长 .
接受这是真的第一点 .
这应该给你一个在另一条腿上的点,并且是最底部的 .
2 回答
首先,您想要反转图像上的颜色 - 然后使用反转的图像 . 您可以执行here所描述的内容来实现此目的 .
我刚刚写了一些代码,似乎成功地检测到倒像上每条腿的底部 . 简而言之,我所做的是访问轮廓数组中的每个元素并找到最大值(由于某种原因)y值 . 从那里,很容易获得相关的x值并在这些坐标处绘制圆圈 . 您可以使用阈值,平滑度等,直到绘制圆圈 . 注意:您需要指定反转图像的路径 . 这是执行该操作的代码(它真的很杂乱无章,我只是拼凑了这个AQAP,所以你可以开始):
为格式化道歉 - 你必须缩进
class test()
以下的所有内容 .我会根据它们的y坐标(最低点优先)对该轮廓的点进行排序 . 取第一点,假设它是一条腿的最底部点 . 现在浏览此序列中的其他点,并检查连接第一个点的线是否满足此条件:
至少(比如说)50%的分数不是轮廓的一部分;
线本身至少(比如说)30像素长 .
接受这是真的第一点 .
这应该给你一个在另一条腿上的点,并且是最底部的 .