訂閱
糾錯(cuò)
加入自媒體

如何通過Python+OpenCV實(shí)現(xiàn)姿態(tài)估計(jì)?

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

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

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

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

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

創(chuàng)建一個(gè)名為“ 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)估計(jì)所需的代碼,在上面,有一個(gè)名為“ PoseDetector”的類,在其中我們創(chuàng)建了兩個(gè)對象“ findPose”和“ getPosition”。在這里,名為“ findPose”的對象將獲取輸入幀,并借助名為mpDraw的mediapipe函數(shù),它將繪制身體上的界標(biāo),而對象“ getPosition””將獲得檢測區(qū)域的坐標(biāo),我們還可以借助此對象高亮顯示任何坐標(biāo)點(diǎn)。在main函數(shù)中,我們將進(jìn)行測試運(yùn)行,你可以通過將main函數(shù)中的第一行更改為“ cap = cv2.VideoCapture(0)”來從網(wǎng)絡(luò)攝像頭中獲取實(shí)時(shí)數(shù)據(jù)。

由于我們在上面的文件中創(chuàng)建了一個(gè)類,因此我們將在另一個(gè)文件中使用它,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í)時(shí)數(shù)據(jù)上運(yùn)行整個(gè)算法。這是測試視頻的輸出。

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

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

發(fā)表評論

0條評論,0人參與

請輸入評論內(nèi)容...

請輸入評論/評論長度6~500個(gè)字

您提交的評論過于頻繁,請輸入驗(yàn)證碼繼續(xù)

  • 看不清,點(diǎn)擊換一張  刷新

暫無評論

暫無評論

人工智能 獵頭職位 更多
掃碼關(guān)注公眾號
OFweek人工智能網(wǎng)
獲取更多精彩內(nèi)容
文章糾錯(cuò)
x
*文字標(biāo)題:
*糾錯(cuò)內(nèi)容:
聯(lián)系郵箱:
*驗(yàn) 證 碼:

粵公網(wǎng)安備 44030502002758號