国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

使用OpenCV和MediaPipe實現(xiàn)姿態(tài)識別!

這篇具有很好參考價值的文章主要介紹了使用OpenCV和MediaPipe實現(xiàn)姿態(tài)識別!。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

opencv 姿態(tài)識別,opencv,python,人工智能,計算機視覺,開發(fā)語言

大家好,我是小F~

MediaPipe是一款由Google開發(fā)并開源的數(shù)據(jù)流處理機器學習應(yīng)用開發(fā)框架。

它是一個基于圖的數(shù)據(jù)處理管線,用于構(gòu)建使用了多種形式的數(shù)據(jù)源,如視頻、音頻、傳感器數(shù)據(jù)以及任何時間序列數(shù)據(jù)。

MediaPipe通過將各個感知模型抽象為模塊并將其連接到可維護的圖中來解決這些問題。

項目地址:

https://github.com/google/mediapipe

今天小F就給大家介紹一下,如何使用MediaPipe實現(xiàn)姿態(tài)識別!

opencv 姿態(tài)識別,opencv,python,人工智能,計算機視覺,開發(fā)語言

通過這項技術(shù),我們可以結(jié)合攝像頭,智能識別人的行為,然后做出一些處理。

比如控制電腦音量,俯臥撐計數(shù),坐姿矯正等功能。

/ 01 /

依賴安裝

使用的Python版本是3.9.7。

需要安裝以下依賴。

mediapipe==0.9.2.1
numpy==1.23.5
opencv-python==4.7.0.72

使用pip命令進行安裝,環(huán)境配置好后,就可以來看姿態(tài)識別的情況了。

有三種,包含全身、臉部、手部的姿態(tài)估計。

/ 02 /

全身姿態(tài)估計

首先是人體姿態(tài)估計,一次只能跟蹤一個人。

并且會在人的身體上顯示33個對應(yīng)的坐標點。

具體代碼如下。

import?os
import?time
import?cv2?as?cv
import?mediapipe?as?mp


class?BodyPoseDetect:
????def?__init__(self,?static_image=False,?complexity=1,?smooth_lm=True,?segmentation=False,?smooth_sm=True,?detect_conf=0.5,?track_conf=0.5):
????????self.mp_body?=?mp.solutions.pose
????????self.mp_draw?=?mp.solutions.drawing_utils
????????self.body?=?self.mp_body.Pose(static_image,?complexity,?smooth_lm,?segmentation,?smooth_sm,?detect_conf,?track_conf)

????def?detect_landmarks(self,?img,?disp=True):
????????img_rgb?=?cv.cvtColor(img,?cv.COLOR_BGR2RGB)
????????results?=?self.body.process(img_rgb)
????????detected_landmarks?=?results.pose_landmarks

????????if?detected_landmarks:
????????????if?disp:
????????????????self.mp_draw.draw_landmarks(img,?detected_landmarks,?self.mp_body.POSE_CONNECTIONS)
????????return?detected_landmarks,?img

????def?get_info(self,?detected_landmarks,?img_dims):
????????lm_list?=?[]
????????if?not?detected_landmarks:
????????????return?lm_list

????????height,?width?=?img_dims
????????for?id,?b_landmark?in?enumerate(detected_landmarks.landmark):
????????????cord_x,?cord_y?=?int(b_landmark.x?*?width),?int(b_landmark.y?*?height)
????????????lm_list.append([id,?cord_x,?cord_y])

????????return?lm_list


def?main(path,?is_image):
????if?is_image:
????????detector?=?BodyPoseDetect(static_image=True)
????????ori_img?=?cv.imread(path)

????????img?=?ori_img.copy()
????????landmarks,?output_img?=?detector.detect_landmarks(img)
????????info_landmarks?=?detector.get_info(landmarks,?img.shape[:2])
????????#?print(info_landmarks[3])

????????cv.imshow("Original",?ori_img)
????????cv.imshow("Detection",?output_img)
????????cv.waitKey(0)

????else:
????????detector?=?BodyPoseDetect()
????????cap?=?cv.VideoCapture(path)
????????prev_time?=?time.time()
????????cur_time?=?0

????????frame_width?=?int(cap.get(3))
????????frame_height?=?int(cap.get(4))
????????out?=?cv.VideoWriter('output.avi',?cv.VideoWriter_fourcc('M',?'J',?'P',?'G'),?10,?(frame_width,?frame_height))??#?保存視頻

????????while?True:
????????????ret,?frame?=?cap.read()
????????????if?not?ret:
????????????????print("Video?Over")
????????????????break

????????????img?=?frame.copy()
????????????landmarks,?output_img?=?detector.detect_landmarks(img)
????????????info_landmarks?=?detector.get_info(landmarks,?img.shape[:2])

????????????cur_time?=?time.time()
????????????fps?=?1/(cur_time?-?prev_time)
????????????prev_time?=?cur_time
????????????cv.putText(output_img,?f'FPS:?{str(int(fps))}',?(10,?70),?cv.FONT_HERSHEY_COMPLEX_SMALL,?2,?(0,?50,?170),?2)

????????????cv.namedWindow('Original',?cv.WINDOW_NORMAL)??#?窗口大小可設(shè)置
????????????cv.resizeWindow('Original',?580,?330)??#?重設(shè)大小
????????????cv.namedWindow('Detection',?cv.WINDOW_NORMAL)??#?窗口大小可設(shè)置
????????????cv.resizeWindow('Detection',?580,?330)??#?重設(shè)大小

????????????out.write(output_img)

????????????cv.imshow("Original",?frame)
????????????cv.imshow("Detection",?output_img)
????????????if?cv.waitKey(1)?&?0xFF?==?ord('q'):
????????????????break

????????cap.release()

????cv.destroyAllWindows()


if?__name__?==?"__main__":

????#?is_image?=?True
????#?media_path?=?'.\\Data\\Images\\running.jpg'
????is_image?=?False
????media_path?=?'.\\Data\\Videos\\basketball.mp4'

????if?os.path.exists(os.path.join(os.getcwd(),?media_path)):
????????main(media_path,?is_image)
????else:
????????print("Invalid?Path")

運行代碼后,結(jié)果如下。

opencv 姿態(tài)識別,opencv,python,人工智能,計算機視覺,開發(fā)語言

左側(cè)是原圖,右側(cè)是檢測結(jié)果。

其中代碼里的is_image參數(shù)表示是否為圖片或視頻

media_path參數(shù)則表示的是源文件的地址。

我們還可以看視頻的檢測效果,具體如下。

opencv 姿態(tài)識別,opencv,python,人工智能,計算機視覺,開發(fā)語言

效果還不錯。

/ 03?/

臉部識別跟蹤

第二個是臉部,MediaPipe可以在臉部周圍畫一個網(wǎng)格來進行檢測和跟蹤。

具體代碼如下。

import?os
import?time
import?argparse
import?cv2?as?cv
import?mediapipe?as?mp

class?FaceDetect:
????def?__init__(self,?static_image=False,?max_faces=1,?refine=False,?detect_conf=0.5,?track_conf=0.5):
????????self.draw_utils?=?mp.solutions.drawing_utils
????????self.draw_spec?=?self.draw_utils.DrawingSpec(color=[0,?255,?0],?thickness=1,?circle_radius=2)
????????self.mp_face_track?=?mp.solutions.face_mesh
????????self.face_track?=?self.mp_face_track.FaceMesh(static_image,?max_faces,?refine,?detect_conf,?track_conf)

????def?detect_mesh(self,?img,?disp=True):
????????results?=?self.face_track.process(img)
????????detected_landmarks?=?results.multi_face_landmarks

????????if?detected_landmarks:
????????????if?disp:
????????????????for?f_landmarks?in?detected_landmarks:
????????????????????self.draw_utils.draw_landmarks(img,?f_landmarks,?self.mp_face_track.FACEMESH_CONTOURS,?self.draw_spec,?self.draw_spec)

????????return?detected_landmarks,?img

????def?get_info(self,?detected_landmarks,?img_dims):
????????landmarks_info?=?[]
????????img_height,?img_width?=?img_dims
????????for?_,?face?in?enumerate(detected_landmarks):
????????????mesh_info?=?[]
????????????for?id,?landmarks?in?enumerate(face.landmark):
????????????????x,?y?=?int(landmarks.x?*?img_width),?int(landmarks.y?*?img_height)
????????????????mesh_info.append((id,?x,?y))
????????????landmarks_info.append(mesh_info)

????????return?landmarks_info

def?main(path,?is_image=True):
????print(path)
????if?is_image:
????????detector?=?FaceDetect()
????????ori_img?=?cv.imread(path)
????????img?=?ori_img.copy()
????????landmarks,?output?=?detector.detect_mesh(img)
????????if?landmarks:
????????????mesh_info?=?detector.get_info(landmarks,?img.shape[:2])
????????????#?print(mesh_info)

????????cv.imshow("Result",?output)
????????cv.waitKey(0)

????else:
????????detector?=?FaceDetect(static_image=False)
????????cap?=?cv.VideoCapture(path)
????????curr_time?=?0
????????prev_time?=?time.time()

????????frame_width?=?int(cap.get(3))
????????frame_height?=?int(cap.get(4))
????????out?=?cv.VideoWriter('output.avi',?cv.VideoWriter_fourcc('M',?'J',?'P',?'G'),?10,?(frame_width,?frame_height))??#?保存視頻

????????while?True:
????????????ret,?frame?=?cap.read()
????????????if?not?ret:
????????????????print("Video?Over")
????????????????break

????????????img?=?frame.copy()
????????????landmarks,?output?=?detector.detect_mesh(img)
????????????if?landmarks:
????????????????mesh_info?=?detector.get_info(landmarks,?img.shape[:2])
????????????????#?print(len(mesh_info))

????????????curr_time?=?time.time()
????????????fps?=?1/(curr_time?-?prev_time)
????????????prev_time?=?curr_time
????????????cv.putText(output,?f'FPS:?{str(int(fps))}',?(10,?70),?cv.FONT_HERSHEY_COMPLEX_SMALL,?2,?(0,?50,?170),?2)
????????????cv.namedWindow('Result',?cv.WINDOW_NORMAL)??#?窗口大小可設(shè)置
????????????cv.resizeWindow('Result',?580,?330)??#?重設(shè)大小

????????????out.write(output)

????????????cv.imshow("Result",?output)
????????????if?cv.waitKey(20)?&?0xFF?==?ord('q'):
????????????????break

????????cap.release()
????cv.destroyAllWindows()


if?__name__?==?"__main__":

????#?is_image?=?True
????#?media_path?=?'.\\Data\\Images\\human_2.jpg'
????is_image?=?False
????media_path?=?'.\\Data\\Videos\\humans_3.mp4'

????if?os.path.exists(os.path.join(os.getcwd(),?media_path)):
????????main(media_path,?is_image)
????else:
????????print("Invalid?Path")

效果如下。

opencv 姿態(tài)識別,opencv,python,人工智能,計算機視覺,開發(fā)語言

/ 04?/

手部跟蹤識別

最后一個是手部,可以同時跟蹤2只手并且在手部顯示相應(yīng)的坐標點。

具體代碼如下。

import?os
import?time
import?argparse
import?cv2?as?cv
import?mediapipe?as?mp

class?HandPoseDetect:
????def?__init__(self,?static_image=False,?max_hands=2,?complexity=1,?detect_conf=0.5,?track_conf=0.5):
????????self.mp_hands?=?mp.solutions.hands
????????self.mp_draw?=?mp.solutions.drawing_utils
????????self.hands?=?self.mp_hands.Hands(static_image,?max_hands,?complexity,?detect_conf,?track_conf)

????def?detect_landmarks(self,?img,?disp=True):
????????img_rgb?=?cv.cvtColor(img,?cv.COLOR_BGR2RGB)
????????results?=?self.hands.process(img_rgb)
????????detected_landmarks?=?results.multi_hand_landmarks

????????if?detected_landmarks:
????????????if?disp:
????????????????for?h_landmark?in?detected_landmarks:
????????????????????self.mp_draw.draw_landmarks(img,?h_landmark,?self.mp_hands.HAND_CONNECTIONS)
????????return?detected_landmarks,?img

????def?get_info(self,?detected_landmarks,?img_dims,?hand_no=1):
????????lm_list?=?[]
????????if?not?detected_landmarks:
????????????return?lm_list

????????if?hand_no?>?2:
????????????print('[WARNING]?Provided?hand?number?is?greater?than?max?number?2')
????????????print('[WARNING]?Calculating?information?for?hand?2')
????????????hand_no?=?2
????????elif?hand_no?<?1:
????????????print('[WARNING]?Provided?hand?number?is?less?than?min?number?1')
????????????print('[WARNING]?Calculating?information?for?hand?1')

????????if?len(detected_landmarks)?<?2:
????????????hand_no?=?0
????????else:
????????????hand_no?-=?1

????????height,?width?=?img_dims
????????for?id,?h_landmarks?in?enumerate(detected_landmarks[hand_no].landmark):
????????????cord_x,?cord_y?=?int(h_landmarks.x?*?width),?int(h_landmarks.y?*?height)
????????????lm_list.append([id,?cord_x,?cord_y])

????????return?lm_list

def?main(path,?is_image=True):
????if?is_image:
????????detector?=?HandPoseDetect(static_image=True)
????????ori_img?=?cv.imread(path)

????????img?=?ori_img.copy()
????????landmarks,?output_img?=?detector.detect_landmarks(img)
????????info_landmarks?=?detector.get_info(landmarks,?img.shape[:2],?2)
????????#?print(info_landmarks)

????????cv.imshow("Landmarks",?output_img)
????????cv.waitKey(0)

????else:
????????detector?=?HandPoseDetect()
????????cap?=?cv.VideoCapture(path)
????????prev_time?=?time.time()
????????cur_time?=?0

????????frame_width?=?int(cap.get(3))
????????frame_height?=?int(cap.get(4))
????????out?=?cv.VideoWriter('output.avi',?cv.VideoWriter_fourcc('M',?'J',?'P',?'G'),?10,?(frame_width,?frame_height))??#?保存視頻

????????while?True:
????????????ret,?frame?=?cap.read()
????????????if?not?ret:
????????????????print("Video?Over")
????????????????break

????????????img?=?frame.copy()
????????????landmarks,?output_img?=?detector.detect_landmarks(img)
????????????info_landmarks?=?detector.get_info(landmarks,?img.shape[:2],?2)
????????????#?print(info_landmarks)

????????????cur_time?=?time.time()
????????????fps?=?1/(cur_time?-?prev_time)
????????????prev_time?=?cur_time
????????????cv.putText(output_img,?f'FPS:?{str(int(fps))}',?(10,?70),?cv.FONT_HERSHEY_COMPLEX_SMALL,?2,?(0,?50,?170),?2)

????????????cv.namedWindow('Original',?cv.WINDOW_NORMAL)??#?窗口大小可設(shè)置
????????????cv.resizeWindow('Original',?580,?330)??#?重設(shè)大小
????????????cv.namedWindow('Detection',?cv.WINDOW_NORMAL)??#?窗口大小可設(shè)置
????????????cv.resizeWindow('Detection',?580,?330)??#?重設(shè)大小

????????????out.write(output_img)

????????????cv.imshow("Detection",?output_img)
????????????cv.imshow("Original",?frame)
????????????if?cv.waitKey(1)?&?0xFF?==?ord('q'):
????????????????break

????????cap.release()

????cv.destroyAllWindows()


if?__name__?==?"__main__":
????is_image?=?False
????media_path?=?'.\\Data\\Videos\\piano_playing.mp4'

????if?os.path.exists(os.path.join(os.getcwd(),?media_path)):
????????main(media_path,?is_image)
????else:
????????print("Invalid?Path")

結(jié)果如下所示。

opencv 姿態(tài)識別,opencv,python,人工智能,計算機視覺,開發(fā)語言

/ 05?/

總結(jié)

以上操作,就是MediaPipe姿態(tài)識別的部分內(nèi)容。

當然我們還可以通過MediaPipe其它的識別功能,來做出有趣的事情。

比如結(jié)合攝像頭,識別手勢動作,控制電腦音量。這個大家都可以自行去學習。

相關(guān)文件及代碼都已上傳,公眾號回復(fù)【姿態(tài)識別】即可獲取。

萬水千山總是情,點個????行不行。

推薦閱讀

opencv 姿態(tài)識別,opencv,python,人工智能,計算機視覺,開發(fā)語言

opencv 姿態(tài)識別,opencv,python,人工智能,計算機視覺,開發(fā)語言

opencv 姿態(tài)識別,opencv,python,人工智能,計算機視覺,開發(fā)語言

···? END? ···文章來源地址http://www.zghlxwxcb.cn/news/detail-673368.html

到了這里,關(guān)于使用OpenCV和MediaPipe實現(xiàn)姿態(tài)識別!的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 人工智能-OpenCV+Python實現(xiàn)人臉識別(人臉檢測)

    在OpenCV中使用Haar特征檢測人臉,那么需要使用OpenCV提供的xml文件(級聯(lián)表)在haarcascades目錄下。這張級聯(lián)表有一個訓練好的AdaBoost訓練集。首先要采用樣本的Haar特征訓練分類器,從而得到一個級聯(lián)的AdaBoost分類器。Haar特征值反映了圖像的灰度變化情況。例如:臉部的一些特征

    2024年02月06日
    瀏覽(91)
  • 樹莓派4B Python3.7.3 Opencv+Mediapipe 手指方向識別

    樹莓派4B Python3.7.3 Opencv+Mediapipe 手指方向識別

    起因: 2023年4月接觸樹莓派之后,想實現(xiàn)手指方向的實時識別,現(xiàn)有Google的框架Mediapipe可以實現(xiàn)21個手指關(guān)鍵點位置實時識別,去嘗試裝Mediapipe以及相關(guān)依賴庫,發(fā)現(xiàn)樹莓派的源(官方源),一些庫比較舊(15年的都有),所以整體思想要裝15年 16年的版本,才能適配 系統(tǒng)環(huán)境

    2024年02月03日
    瀏覽(22)
  • [ Python+OpenCV+Mediapipe ] 實現(xiàn)手勢控制音量

    [ Python+OpenCV+Mediapipe ] 實現(xiàn)手勢控制音量

    目錄 一、寫在前面 二、本文內(nèi)容 三、開發(fā)環(huán)境 ?四、代碼實現(xiàn) 4.1引入所需包 4.2 定義一個類并初始化 4.3 定義繪制一界面并實現(xiàn)音量控制的主方法 五、看一看實際效果吧 六、完整代碼 七、小結(jié) ?八、感謝 ? ? ? ?本文所用例子為個人學習的小結(jié),如有不足之處請各位多多

    2024年02月22日
    瀏覽(15)
  • Opencv + MediaPipe -> 手勢識別

    Opencv + MediaPipe -> 手勢識別

    一、概述 ????????OpenCV(Open Source Computer Vision Library)是一個跨平臺的計算機視覺庫,它提供了許多用于圖像和視頻處理的功能,包括圖像和視頻的讀取、預(yù)處理、特征提取、特征匹配、目標檢測等。OpenCV是C++編寫的,也提供了Python、Java等語言的接口,可以方便地在不同

    2024年02月05日
    瀏覽(21)
  • 基于opencv-mediapipe的手勢識別

    基于opencv-mediapipe的手勢識別

    上一篇文章介紹了基于opencv的手勢識別,如果大家運行了我的代碼,會發(fā)現(xiàn)代碼中找出手部輪廓的效果不是很理想。當時我在網(wǎng)上找尋解決的辦法,剛好找到了mediapip庫,然后我就利用opencv和mediapipe這兩個庫重新進行了手勢識別的代碼編寫。效果還不錯,寫篇文章記錄一下。

    2024年02月09日
    瀏覽(16)
  • python+opencv+mediapipe實現(xiàn)手勢檢測上下左右(含完整代碼)

    python+opencv+mediapipe實現(xiàn)手勢檢測上下左右(含完整代碼)

    應(yīng)用場景:ai換臉,根據(jù)左右手勢選擇圖片,上下則表示選中。 版本號:python3.7(一開始是3.6,但是mediapipe最低就是3.7 因為網(wǎng)上檢測的都不太準,所以我在判斷的時候加入了如果70次里55次檢測的是左才返回左,測試完之后效果還可以,蠻準的。判斷方法想的頭都要禿了。 實

    2024年04月11日
    瀏覽(29)
  • 基于opencv與mediapipe的面部跟蹤(人臉檢測追蹤)python代碼實現(xiàn)

    基于opencv與mediapipe的面部跟蹤(人臉檢測追蹤)python代碼實現(xiàn)

    ????????面部跟蹤主要是從圖像或視頻中檢測出人臉并輸出人臉位置及其大小等有效信息,并在后續(xù)幀中繼續(xù)捕獲人臉的位置及其大小等信息,實時跟蹤人臉。此技術(shù)可用于海關(guān)、機場、視頻會議、拍照對焦、面部打碼等業(yè)務(wù)場景。(與人臉識別是不同范疇) ? ? ? ? 本

    2024年01月17日
    瀏覽(30)
  • 基于opencv與mediapipe的民族舞舞蹈動作識別

    基于opencv與mediapipe的民族舞舞蹈動作識別

    需要項目的請關(guān)注、私信 Opencv(Open Source Computer Vision Library)是一個基于開源發(fā)行的跨平臺計算機視覺庫,它實現(xiàn)了圖像處理和計算機視覺方面的很多通用算法,已成為計算機視覺領(lǐng)域最有力的研究工具。在這里我們要區(qū)分兩個概念:圖像處理和計算機視覺的區(qū)別:圖像處理

    2024年02月10日
    瀏覽(20)
  • Python+OpenCV+OpenPose實現(xiàn)人體姿態(tài)估計(人體關(guān)鍵點檢測)

    Python+OpenCV+OpenPose實現(xiàn)人體姿態(tài)估計(人體關(guān)鍵點檢測)

    1、人體姿態(tài)估計簡介 2、人體姿態(tài)估計數(shù)據(jù)集 3、OpenPose庫 4、實現(xiàn)原理 5、實現(xiàn)神經(jīng)網(wǎng)絡(luò) 6、實現(xiàn)代碼 人體姿態(tài)估計(Human Posture Estimation),是通過將圖片中已檢測到的人體關(guān)鍵點正確的聯(lián)系起來,從而估計人體姿態(tài)。 人體關(guān)鍵點通常對應(yīng)人體上有一定自由度的關(guān)節(jié),比如頸、

    2024年02月04日
    瀏覽(23)
  • 基于mediapipe的姿態(tài)識別和簡單行為識別

    基于mediapipe的姿態(tài)識別和簡單行為識別

    源碼地址: ???????? 其實這部分很簡單,直接在windows命令行的環(huán)境下 就可以啦 Mediapipe是一個用于構(gòu)建機器學習管道的框架,用戶處理視頻、音頻等時間序列數(shù)據(jù)。這個跨平臺框架適用于桌面/服務(wù)器、Android、ios和各類嵌入式設(shè)備。 目前mediapipe包含16個solutions,分別為 總

    2024年02月02日
    瀏覽(92)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包