訂閱
糾錯
加入自媒體

如何通過Python+OpenCV實現姿態估計?

2021-05-19 10:17
磐創AI
關注

在上面的內容中,你可以很容易地使用OpenCV從名為“ a.mp4”的視頻中讀取幀,并將幀從BGR轉換為RGB圖像,并使用mediapipe在整個處理后的幀上繪制界標。

最后,我們將獲得具有地標的視頻輸出,如下所示。

變量“ cTime”,“ pTime”和“ fps”用于計算每秒的讀取幀。

你可以在下面的輸出中看到左角的幀數。

終端部分中的輸出是mediapipe檢測到的界標。姿勢界標你可以在上圖的終端部分中看到姿勢界標的列表。每個地標包括以下內容:x和y:這些界標坐標分別通過圖像的寬度和高度歸一化為[0.0,1.0]。z:通過將臀部中點處的深度作為原點來表示界標深度,并且z值越小,界標與攝影機越近。z的大小幾乎與x的大小相同?梢娦裕海0.0,1.0]中的值,指示界標在圖像中可見的可能性。MediaPipe運行得很好。讓我們創建一個用于估計姿勢的模塊,并且將該模塊用于與姿態估計有關的任何其他項目。另外,你可以在網絡攝像頭的幫助下實時使用它。

創建一個名為“ PoseModule”的python文件import cv2
import mediapipe as mp
import time
class PoseDetector:
def __init__(self, mode = False, upBody = False, smooth=True, detectionCon = 0.5, trackCon = 0.5):
self.mode = mode
self.upBody = upBody
self.smooth = smooth
self.detectionCon = detectionCon
self.trackCon = trackCon
self.mpDraw = mp.solutions.drawing_utils
self.mpPose = mp.solutions.pose
self.pose = self.mpPose.Pose(self.mode, self.upBody, self.smooth, self.detectionCon, self.trackCon)
def findPose(self, img, draw=True):
imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
self.results = self.pose.process(imgRGB)
#print(results.pose_landmarks)
if self.results.pose_landmarks:
if draw:
self.mpDraw.draw_landmarks(img, self.results.pose_landmarks, self.mpPose.POSE_CONNECTIONS)
return img
def getPosition(self, img, draw=True):
lmList= []
if self.results.pose_landmarks:
for id, lm in enumerate(self.results.pose_landmarks.landmark):
h, w, c = img.shape
#print(id, lm)
cx, cy = int(lm.x * w), int(lm.y * h)
lmList.append([id, cx, cy])
if draw:
cv2.circle(img, (cx, cy), 5, (255, 0, 0), cv2.FILLED)
return lmList
def main():
cap = cv2.VideoCapture('videos/a.mp4') #make VideoCapture(0) for webcam
pTime = 0
detector = PoseDetector()
while True:
success, img = cap.read()
img = detector.findPose(img)
lmList = detector.getPosition(img)
print(lmList)
cTime = time.time()
fps = 1 / (cTime - pTime)
pTime = cTime
cv2.putText(img, str(int(fps)), (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 3)
cv2.imshow("Image", img)
cv2.waitKey(1)
if __name__ == "__main__":
 main() 

這是姿態估計所需的代碼,在上面,有一個名為“ PoseDetector”的類,在其中我們創建了兩個對象“ findPose”和“ getPosition”。在這里,名為“ findPose”的對象將獲取輸入幀,并借助名為mpDraw的mediapipe函數,它將繪制身體上的界標,而對象“ getPosition””將獲得檢測區域的坐標,我們還可以借助此對象高亮顯示任何坐標點。在main函數中,我們將進行測試運行,你可以通過將main函數中的第一行更改為“ cap = cv2.VideoCapture(0)”來從網絡攝像頭中獲取實時數據。

由于我們在上面的文件中創建了一個類,因此我們將在另一個文件中使用它。現在是最后階段import cv2
import time
import PoseModule as pm
cap = cv2.VideoCapture(0)
pTime = 0
detector = pm.PoseDetector()
while True:
success, img = cap.read()
img = detector.findPose(img)
lmList = detector.getPosition(img)
print(lmList)
cTime = time.time()
fps = 1 / (cTime - pTime)
pTime = cTime
cv2.putText(img, str(int(fps)), (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 3)
cv2.imshow("Image", img)
cv2.waitKey(1)

在這里,代碼將僅調用上面創建的模塊,并在輸入視頻或網絡攝像頭的實時數據上運行整個算法。這是測試視頻的輸出。

完整的代碼可在下面的GitHub鏈接中找到。

<上一頁  1  2  
聲明: 本文由入駐維科號的作者撰寫,觀點僅代表作者本人,不代表OFweek立場。如有侵權或其他問題,請聯系舉報。

發表評論

0條評論,0人參與

請輸入評論內容...

請輸入評論/評論長度6~500個字

您提交的評論過于頻繁,請輸入驗證碼繼續

暫無評論

暫無評論

    人工智能 獵頭職位 更多
    掃碼關注公眾號
    OFweek人工智能網
    獲取更多精彩內容
    文章糾錯
    x
    *文字標題:
    *糾錯內容:
    聯系郵箱:
    *驗 證 碼:

    粵公網安備 44030502002758號