第1列

时间:2016-05-09 14:02:06

标签: python opencv max min contour

嘿,我有一个简短的问题。假设我有一个列表列表,例如:

  

([[[362,239]],[[362,367]],[[386,367]],[[386,239]]])

如何分别获得第1列和第2列的最大值

示例的答案应该是:

  

col1_max = 386,col2_max = 367

我已经尝试过:

  

col1_max = max(cnts.iteritems(),key = operator.itemgetter(1))[0]   print col1_max

但在这里我只得到错误代码:" AttributeError:' list'对象没有属性' iteritems'"

感谢您的帮助:D

更新

首先感谢他所有hlp到目前为止的深度空间

我将以不同的方式再次表达我的问题 现在我想写一个代码

  • 检测对象

  • 这些中心

到目前为止的代码是:

import imutils
import cv2
import os, os.path

DIR = 'pics/' numberOfPictures = len([name for name in os.listdir(DIR) if os.path.isfile(os.path.join(DIR, name))])

for i in range(0, numberOfPictures): image = cv2.imread('pics/' + str(i) + '.png', 0) thresh = cv2.threshold(image, 60, 255, cv2.THRESH_BINARY)[1]

cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) cnts = cnts[0] if imutils.is_cv2() else cnts[1] j = 1 for c in cnts: M = cv2.moments(c) if M["m00"] != 0: cX = int(M["m10"] / M["m00"]) cY = int(M["m01"] / M["m00"]) else: continue print cnts j = j + 1 cv2.drawContours(image, [c], -1, (0, 255, 0), 2) cv2.circle(image, (cX, cY), 7, (255, 255, 255), -1) cv2.putText(image, "center", (cX - 20, cY - 20), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2) cv2.imshow("Image", image) cv2.waitKey(0) cv2.destroyAllWindows()

这一点很有效 但现在我想从cnts中获取最大值和最小值

我使用cv2.findContours创建我的cnts cnts = [array([[[362,239]],[[362,367]],[[386,367]],[[386,239]]]]]

如何提取第1列的最大值和第2列的最大值

感谢任何hlp:D

3 个答案:

答案 0 :(得分:1)

如果您的输入是列表列表(与您的示例中的不同),这应该有效:

li = [[362, 239], [362, 367], [386, 367], [386, 239]]

def get_max_by_col(li, col):
    # col - 1 is used to 'hide' the fact lists' indexes are zero-based from the caller
    return max(li, key=lambda x: x[col - 1])[col - 1]

print(get_max_by_col(li, 1))
>> 386

print(get_max_by_col(li, 2))
>> 367

更新如果您有列表列表,请更改行
return max(li, key=lambda x: x[col - 1])[col - 1]
在上面的代码中 return max(li, key=lambda x: x[0][col - 1])[0][col - 1]

答案 1 :(得分:0)

好吧我想我自己做了^^

但是想要显示可能的答案

import imutils
import cv2
import os, os.path

DIR = 'pics/' numberOfPictures = len([name for name in os.listdir(DIR) if os.path.isfile(os.path.join(DIR, name))])

for i in range(0, numberOfPictures):

image = cv2.imread('pics/' + str(i) + '.png', 0) thresh = cv2.threshold(image, 60, 255, cv2.THRESH_BINARY)[1] cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) cnts = cnts[0] if imutils.is_cv2() else cnts[1] j = 1 for c in cnts: M = cv2.moments(c) if M["m00"] != 0: cX = int(M["m10"] / M["m00"]) cY = int(M["m01"] / M["m00"]) else: continue def get_max_by_col(c, col): return max(c, key=lambda x: x[0][col - 1])[0][col - 1] print(get_max_by_col(c, 1)) print(get_max_by_col(c, 2)) j = j + 1 cv2.drawContours(image, [c], -1, (0, 255, 0), 2) cv2.circle(image, (cX, cY), 7, (255, 255, 255), -1) cv2.putText(image, "center", (cX - 20, cY - 20), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2) cv2.imshow("Image", image) cv2.waitKey(0) cv2.destroyAllWindows()

我得到386和367作为

的最大值

c = [[[362 239]],[[362 367]],[[386 367]],[[386 239]]]

答案 2 :(得分:0)

我知道这是一个老问题,但是 你也可以使用numpy的超快速内置功能之一: np.argmax(data, axis=0), 这将返回所有列中的第一个最大出现次数,请参阅numpy documentation