([[[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.pathDIR = '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
答案 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.pathDIR = '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