用深度學習及opencv 檢測 手關鍵點

用深度學習及opencv進行手關鍵點檢測

1.下載模型

運行getModels.sh來下載手模型,配置到hand/目錄下。

sudo chmod a+x getModels.sh

./getModels.sh

2.加載模型及圖像(Python代碼)

protoFile = "hand/pose_deploy.prototxt"

weightsFile = "hand/pose_iter_102000.caffemodel"

nPoints = 22

frame = cv2.imread("hand.jpg")

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

3.運行預測(Python代碼)

inpBlob = cv2.dnn.blobFromImage(frame, 1.0 / 255, (inWidth, inHeight),

(0, 0, 0), swapRB=False, crop=False)

net.setInput(inpBlob)

output = net.forward()

4.顯示檢測結果

輸出包括了22矩陣點,用opendv的minmaxLoc函數。

points = []

for i in range(nPoints):

# confidence map of corresponding body's part.

probMap = output[0, i, :, :]

probMap = cv2.resize(probMap, (frameWidth, frameHeight))

# Find global maxima of the probMap.

minVal, prob, minLoc, point = cv2.minMaxLoc(probMap)

if prob > threshold :

cv2.circle(frameCopy, (int(point[0]), int(point[1])), 8, (0, 255, 255), thickness=-1, lineType=cv2.FILLED)

cv2.putText(frameCopy, "{}".format(i), (int(point[0]), int(point[1])), 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(point[0]), int(point[1])))

else :

points.append(None)cv2.imshow('Output-Keypoints', frameCopy)

5.描畫手部骨骼

# 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-Skeleton', frame)

用深度學習及opencv 檢測 手關鍵點


分享到:


相關文章: