Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中提取人体轮廓_Python_Python 3.x_Opencv_Computer Vision - Fatal编程技术网

如何在python中提取人体轮廓

如何在python中提取人体轮廓,python,python-3.x,opencv,computer-vision,Python,Python 3.x,Opencv,Computer Vision,我有几个人体步态数据集。以下是图片: 输入图像 我正在尝试移除背景,这样我在生成的图像中只有人,我正在尝试从这个人身上提取剪影。以下是我试图获得所需结果的代码: 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.cvtCol

我有几个人体步态数据集。以下是图片:

输入图像

我正在尝试移除背景,这样我在生成的图像中只有人,我正在尝试从这个人身上提取剪影。以下是我试图获得所需结果的代码:

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) 什么

输出图像2

问题就在这里。预期的结果图像应仅为人体轮廓。我正在尝试获得以下结果图像:

事实真相


如果可能的话,我将使用人类步态分类项目中的结果,请指导我这样做的一般方法,不仅仅是在这个特定的情况下,也就是说,我有不同的人类步态数据集。最好的方法是什么。谢谢你的帮助。

我还尝试了opencv中的一些API来提取人体轮廓,但是结果并不令人满意

我建议您尝试一些由大型科技公司提供的开放平台,这里是链接:


希望我能帮助你

我还尝试了opencv中的一些API来提取人体轮廓,但是结果并不令人满意

我建议您尝试一些由大型科技公司提供的开放平台,这里是链接:


希望我能帮助你

为什么图像左下角的线条被认为是地面真相的一部分?可能该线条不应该出现在图像中。如果有更精确的结果图像,我将再次编辑它。您可以使用inRange()尝试大津阈值或颜色阈值。为什么图像左下角的线被视为基本事实的一部分?可能该线不应在图像中。如果有更精确的结果图像,我将再次编辑它。您可以使用inRange()尝试大津阈值或颜色阈值