如何通過Python+OpenCV實現(xiàn)姿態(tài)估計?
在上面的內(nèi)容中,你可以很容易地使用OpenCV從名為“ a.mp4”的視頻中讀取幀,并將幀從BGR轉(zhuǎn)換為RGB圖像,并使用mediapipe在整個處理后的幀上繪制界標(biāo)。
最后,我們將獲得具有地標(biāo)的視頻輸出,如下所示。
變量“ cTime”,“ pTime”和“ fps”用于計算每秒的讀取幀。
你可以在下面的輸出中看到左角的幀數(shù)。
終端部分中的輸出是mediapipe檢測到的界標(biāo)。姿勢界標(biāo)你可以在上圖的終端部分中看到姿勢界標(biāo)的列表。每個地標(biāo)包括以下內(nèi)容:x和y:這些界標(biāo)坐標(biāo)分別通過圖像的寬度和高度歸一化為[0.0,1.0]。z:通過將臀部中點處的深度作為原點來表示界標(biāo)深度,并且z值越小,界標(biāo)與攝影機(jī)越近。z的大小幾乎與x的大小相同。可見性:[0.0,1.0]中的值,指示界標(biāo)在圖像中可見的可能性。MediaPipe運行得很好。讓我們創(chuàng)建一個用于估計姿勢的模塊,并且將該模塊用于與姿態(tài)估計有關(guān)的任何其他項目。另外,你可以在網(wǎng)絡(luò)攝像頭的幫助下實時使用它。
創(chuàng)建一個名為“ 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.a(chǎn)ppend([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()
這是姿態(tài)估計所需的代碼,在上面,有一個名為“ PoseDetector”的類,在其中我們創(chuàng)建了兩個對象“ findPose”和“ getPosition”。在這里,名為“ findPose”的對象將獲取輸入幀,并借助名為mpDraw的mediapipe函數(shù),它將繪制身體上的界標(biāo),而對象“ getPosition””將獲得檢測區(qū)域的坐標(biāo),我們還可以借助此對象高亮顯示任何坐標(biāo)點。在main函數(shù)中,我們將進(jìn)行測試運行,你可以通過將main函數(shù)中的第一行更改為“ cap = cv2.VideoCapture(0)”來從網(wǎng)絡(luò)攝像頭中獲取實時數(shù)據(jù)。
由于我們在上面的文件中創(chuàng)建了一個類,因此我們將在另一個文件中使用它,F(xiàn)在是最后階段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)
在這里,代碼將僅調(diào)用上面創(chuàng)建的模塊,并在輸入視頻或網(wǎng)絡(luò)攝像頭的實時數(shù)據(jù)上運行整個算法。這是測試視頻的輸出。
完整的代碼可在下面的GitHub鏈接中找到。
請輸入評論內(nèi)容...
請輸入評論/評論長度6~500個字
最新活動更多
-
即日-11.13立即報名>>> 【在線會議】多物理場仿真助跑新能源汽車
-
11月20日火熱報名中>> 2024 智能家居出海論壇
-
11月28日立即報名>>> 2024工程師系列—工業(yè)電子技術(shù)在線會議
-
12月19日立即報名>> 【線下會議】OFweek 2024(第九屆)物聯(lián)網(wǎng)產(chǎn)業(yè)大會
-
即日-12.26火熱報名中>> OFweek2024中國智造CIO在線峰會
-
即日-2025.8.1立即下載>> 《2024智能制造產(chǎn)業(yè)高端化、智能化、綠色化發(fā)展藍(lán)皮書》
推薦專題
- 高級軟件工程師 廣東省/深圳市
- 自動化高級工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級銷售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術(shù)專家 廣東省/江門市
- 封裝工程師 北京市/海淀區(qū)
- 結(jié)構(gòu)工程師 廣東省/深圳市