python - 如何在python中提取人体轮廓
问题描述
我有几个人类步态数据集。以下是图片:
输入图像
我正在尝试删除背景,以便在生成的图像中只有人类,并且我正在尝试从这个人类中提取轮廓。以下是我试图获得所需结果的代码:
import cv2
import numpy as np
import matplotlib.pyplot as plt
image = cv2.imread("inputImage.jpg")
image = cv2.cvtColor(image,cv2.COLOR_BGR2RGB)
grayImage = cv2.cvtColor(image,cv2.COLOR_RGB2GRAY)
ret, thresh = cv2.threshold(
grayImage,
120,
255,
cv2.THRESH_BINARY_INV)
plt.imshow(thresh, cmap="gray", vmin=0, vmax=255),plt.show()
"""
nlabels, labels, stats, centroids = cv2.connectedComponentsWithStats(
thresh,
None,
None,
None,
8,
cv2.CV_32S)
sizes = stats[1:, -1]
img2 = np.zeros((labels.shape), np.uint8)
for i in range(0, nlabels - 1):
if sizes[i] >= 25: #filter small dotted regions
img2[labels == i + 1] = 255
thresh = cv2.bitwise_not(img2)
plt.imshow(thresh, cmap="gray", vmin=0, vmax=255),plt.show()
"""
kernel = np.ones((3,3),np.uint8)
opening = cv2.morphologyEx(thresh,cv2.MORPH_OPEN,kernel, iterations = 2)
sure_bg = cv2.dilate(opening,kernel,iterations=20)
dist_transform = cv2.distanceTransform(opening,cv2.DIST_L2,5)
ret, sure_fg = cv2.threshold(dist_transform,0.7*dist_transform.max(),255,0)
sure_fg = np.uint8(sure_fg)
unknown = cv2.subtract(sure_bg,sure_fg)
ret, markers = cv2.connectedComponents(sure_fg)
markers = markers+1
markers[unknown==255] = 0
markers = cv2.watershed(image,markers)
image[markers == -1] = [255,0,0]
bgdModel = np.zeros((1,65),np.float64)
fgdModel = np.zeros((1,65),np.float64)
rect = (10,10,665,344)
cv2.grabCut(image,markers,rect,bgdModel,fgdModel,50,cv2.GC_INIT_WITH_RECT)
mask2 = np.where((markers==2)|(markers==0),0,1).astype('uint8')
image = image*mask2[:,:,np.newaxis]
plt.imshow(image, cmap="gray", vmin=0, vmax=255),plt.show()
通过减去得到的图像:
1)门槛:
输出图像1
2)Whatershed
输出图像2
这是问题所在。预期的结果图像应该只是一个人的剪影。我想要做的是得到以下结果图像:
地面实况
另外,如果可能的话,我将在人类步态分类项目中使用结果,请指导我使用一般方法来执行此操作,而不仅仅是在这种特定情况下,即我有不同的人类步态数据集。这样做的最佳方法是什么。谢谢你的帮助。
解决方案
我也尝试过在 opencv 中使用一些 API 来提取人体轮廓,但结果并不令人满意。
推荐大家尝试一些大型科技公司提供的开放平台,链接如下: http: //ai.baidu.com/forum/topic/show/880529。
希望我能帮到你!
推荐阅读
- python - 无法绘制熊猫系列的直方图
- python - Python脚本中的Listagg函数问题
- c# - 等待客户端重新连接服务器一段时间 - Socket io Unity Express 服务器
- google-cloud-platform - Google IoT Core 如何实现 MQTT 负载平衡
- graphql - 如何在 ExceptionFilter [NestJS] 中找出 Query 或 Mutation 返回类型
- r - R S4 插槽,更改内容,而不是属性
- node.js - Chokidar - 文件观察器
- sublimetext3 - 如何缩进文本而不在崇高包中添加空格?
- python - PyTorch 模型输入形状
- sql - 为什么 Clickhouse 中的“A 左连接 B”和“B 右连接 A”不同?