我有一幅人头的图像,从中我可以检测到拐角点。这是我的代码及其结果:
import cv2
import numpy as np
Head = cv2.imread('Head.jpg')
#Corner detection
gray = cv2.cvtColor(Head, cv2.COLOR_BGR2GRAY)
gray = np.float32(gray)
corners = cv2.goodFeaturesToTrack(gray, 50, 0.01, 10)
corners = np.int0(corners)
for corner in corners:
x,y = corner.ravel()
cv2.circle(Head, (x,y), 3, 255, -1)
z = np.max(y)
cv2.circle(Head, (x,z), 5, (0,0,255), -1)
cv2.imshow('Corner', Head)
cv2.waitKey(0)
cv2.destroyAllWindows()
头像:
检测到角点:
在这里,我试图指出颈部的两个角(上图中的最低点)。为此,我从角的numpy数组中找出最大值y并将该点绘制为红色点。但是,其绘制的红点在眼前。我做错了什么?
如何找出颈部的坐标点(仅最低的两个角点)?
最佳答案
问题在这一行:
z = np.max(y)
此处y的值将只是在上一个循环中查看的最后一个角的值。您可以做的是创建所有角坐标的列表,然后根据y值对列表进行排序:
ordered_coords = [ corner.ravel() for corner in corners ]
ordered_coords.sort(key=lambda x: x[1])
您要寻找的具有最高y值的两个角将成为列表中的最后两个元素。
cv2.circle(Head, ordered_coords[-1], 5, (0,0,255), -1)