我试图对两个不同的人采取二元面具,其他一切都是黑色的。现在我想使用将每个人分组到他们自己的集群中K-means这样我最终就可以在它们周围绘制边界框。这是我到目前为止的代码:
def kmeans(img):
k_values = range(1, 5)
pixels = np.float32(img.reshape(-1,1))
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)
flags = cv2.KMEANS_PP_CENTERS
min_ssd = 0
for k in k_values:
ssd,labels,centers = cv2.kmeans(pixels,k,None,criteria,10,flags)
if k == 1 or ssd < min_ssd: #looking for elbow in graph
min_ssd = ssd
min_labels = labels
min_centers = centers
return min_labels,min_centers
就目前而言,此代码将中心作为像素值而不是坐标返回,因此我丢失了帧中的空间信息。我不太确定如何更改此代码以获得聚类中心作为图像中的点并能够可视化聚类。
Edit:我改变了方法,首先我从 OpenCV 开始simpleblobdetector()
检测图像中每个斑点的质心。从这里我用这些值初始化质心。我计划在完成更改后更新代码
最终代码
def kmeans_helper(img, centroids):
data = np.nonzero(img)
data = tuple(zip(data[0],data[1]))
data = np.asarray(data).reshape(-1,2)
num_clusters = len(centroids)
kmeans = KMeans(n_clusters = num_clusters, init = centroids, n_init = 1)
kmeans.fit(data)
centroids_array = np.uint8(kmeans.cluster_centers_)
num_labels = np.unique(kmeans.labels_)
clusters = [data[kmeans.labels_ == label] for label in num_labels]
return clusters
我想我会为将来可能需要它的人更新我的最终代码。