Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.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 如何使用OpenCV中的OpenPose获取各个身体部位的大小?_Python_Opencv_Openpose - Fatal编程技术网

Python 如何使用OpenCV中的OpenPose获取各个身体部位的大小?

Python 如何使用OpenCV中的OpenPose获取各个身体部位的大小?,python,opencv,openpose,Python,Opencv,Openpose,我正在一个虚拟化妆平台上工作。我想从一张图像中得到一个人的尺寸。我已经实现了OpenPose,并且能够获得一个人的骨架,但是我不知道如何获得个人身体部位的测量值 下面是使用OpenPose、OpenCV获取骨架的代码 获取骨架 import cv2 import time import numpy as np protoFile = "pose/coco/pose_deploy_linevec.prototxt" weightsFile = "pose/coc

我正在一个虚拟化妆平台上工作。我想从一张图像中得到一个人的尺寸。我已经实现了OpenPose,并且能够获得一个人的骨架,但是我不知道如何获得个人身体部位的测量值

下面是使用OpenPose、OpenCV获取骨架的代码

获取骨架

import cv2 
import time
import numpy as np


protoFile = "pose/coco/pose_deploy_linevec.prototxt"
weightsFile = "pose/coco/pose_iter_440000.caffemodel"
nPoints = 18
POSE_PAIRS = [[1, 0], [1, 2], [1, 5], [2, 3], [3, 4], [5, 6], [6, 7], 
              [1, 8], [8, 9], [9, 10], [1, 11], [11, 12], [12, 13],
              [0, 14], [0, 15], [14, 16], [15, 17]]


frame = cv2.imread("./fatguy.jpg")
frameCopy = np.copy(frame)
frameWidth = frame.shape[1]
frameHeight = frame.shape[0]
threshold = 0.1 

net = cv2.dnn.readNetFromCaffe(protoFile, weightsFile)

t = time.time()
# input image dimensions for the network
inWidth = 368 
inHeight = 368 
inpBlob = cv2.dnn.blobFromImage(frame, 1.0 / 255, (inWidth, inHeight),
                                (0, 0, 0), swapRB=False, crop=False)

net.setInput(inpBlob)

output = net.forward()
print(output)
print("time taken by network : {:.3f}".format(time.time() - t)) 

H = output.shape[2]
W = output.shape[3]

# Empty list to store the detected keypoints
points = []

for i in range(nPoints):
    # confidence map of corresponding body's part.
    probMap = output[0, i, :, :]

    # Find global maxima of the probMap.
    minVal, prob, minLoc, point = cv2.minMaxLoc(probMap)

    # Scale the point to fit on the original image
    x = (frameWidth * point[0]) / W 
    y = (frameHeight * point[1]) / H 

    if prob > threshold:
        cv2.circle(frameCopy, (int(x), int(y)), 8, (0, 255, 255),
                   thickness=-1,
                   lineType=cv2.FILLED)
        cv2.putText(frameCopy, "{}".format(i), (int(x), int(y)),
                    cv2.FONT_HERSHEY_SIMPLEX,
                    1, (0, 0, 255), 2,
                    lineType=cv2.LINE_AA)

        # Add the point to the list if the probability
        # is greater than the threshold
        points.append((int(x), int(y)))
    else:
        points.append(None)

# Draw Skeleton
for pair in POSE_PAIRS:
    partA = pair[0]
    partB = pair[1]

    if points[partA] and points[partB]:
        cv2.line(frame, points[partA], points[partB], (0, 255, 255), 2)
        cv2.circle(frame, points[partA], 8, (0, 0, 255),
                   thickness=-1,
                   lineType=cv2.FILLED)


# cv2.imshow('Output-Keypoints', frameCopy)
cv2.imshow('Output-Skeleton', frame)


cv2.imwrite('Output-Keypoints.jpg', frameCopy)
cv2.imwrite('Output-Skeleton.jpg', frame)

print("Total time taken : {:.3f}".format(time.time() - t)) 

cv2.waitKey(0) 


有人能告诉我如何前进吗?

事实上,你的问题很重要

一般来说,你会有多种选择,我将在抽象的步骤中描述你,你如何实现这一点。有些方法工作量较大,有些精度较低。到目前为止,我成功地使用了变体A

变体A)

设置:

您使用1个摄像头,并且您的人直接位于平面2D表面的前面。相机与2d曲面(背景)的固定距离和角度应始终相同。我们必须假设人是平的,并使用针孔相机的概念。您可以执行以下处理步骤

处理:

步骤A1)通过打印的2D图案(棋盘或其他..)执行一次操作 重要的是,你的图案在背景上总是尽可能平坦。在背景的不同点上生成多个图像,并尝试覆盖整个可见空间。 使用opencv示例进行相机校准,以进行姿势估计(估计到相机的位置和距离)和镜头校正 . 您应该事先编辑配置xml文件,定义您正在使用的模式以及您正在使用的正方形大小(单位为mm或cm)

第2步)给你的人拍张照片,进行镜头校正

步骤A3)通过开放式姿势框架计算“身体点”

步骤a4)使用步骤A1)中的相机校准数据,将点从“像素空间”投影到“真实世界”空间 现在计算欧氏距离,单位为mm/或cm(在校准xml文件中定义)。 这一步假设我们在100%平坦的2D曲面上投影点,因为我们的z尺寸在这里设置为零,否则计算要复杂得多,但也可以这样做。 我加了一个

变体B:

在图片中使用一个易于检测的已知几何体的“对象”,作为某种比较器确定大小。您还必须知道一些相机参数,如焦距。我找到了一本书,里面还包括一些数学背景

变体C:

设置:

使用2个或更多摄像头和3D重建。这可能会导致更高的准确性。同样,这个人现在可以站在你的摄影场的任何地方

步骤:

步骤C1)查看良好的校准步行槽

步骤c2)使用三维重建进行距离计算

变体D:

使用3D扫描仪或Kinect系统(
)

首先需要进行良好的校准,其次人与摄像机之间的距离应保持不变,否则会丢失比率(如果摄像机为2d而非3d),第三分辨率不应改变,第四人应与摄像机保持平行,第五人需要类似(10像素=1mm)的参考我可能可以通过用于拍照的移动应用程序来控制所有这些。谢谢你的建议。我会读更多关于这方面的内容。看看。你可以为自己制作一组常量或一个查找表,以便更轻松地处理联合名称并获取相关索引。问题太广泛了。正如YunusTemurlenk所说的,你必须考虑很多事情,这些主要取决于你想要从测量中得到的准确度。其中一个帮助它工作的因素是考虑左器官(手,腿)与右器官大小相同的事实。有了这个事实,您可以改进您的测量。这实际上是一个非常好的建议,感谢您花时间回答。我真的很感激。谢谢你抽出时间提供如此全面的答案。我真的很感激!一旦我有了某种工作原型,我会把这篇文章打回去。祝你玩得愉快!