如何通過Python+OpenCV實現姿態估計?
在上面的內容中,你可以很容易地使用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鏈接中找到。
請輸入評論內容...
請輸入評論/評論長度6~500個字
最新活動更多
-
11月7日立即參評>> 【評選】維科杯·OFweek 2025(第十屆)物聯網行業年度評選
-
11月20日立即報名>> 【免費下載】RISC-V芯片發展現狀與測試挑戰-白皮書
-
即日-11.25立即下載>>> 費斯托白皮書《柔性:汽車生產未來的關鍵》
-
11月27日立即報名>> 【工程師系列】汽車電子技術在線大會
-
11月28日立即下載>> 【白皮書】精準洞察 無線掌控——283FC智能自檢萬用表
-
12月18日立即報名>> 【線下會議】OFweek 2025(第十屆)物聯網產業大會


分享













