Sizin gibi okuyucular MUO'yu desteklemeye yardımcı oluyor. Sitemizdeki bağlantıları kullanarak bir satın alma işlemi gerçekleştirdiğinizde, bir ortaklık komisyonu kazanabiliriz. Devamını oku.

Bilgisayar görüşü ve Python'daki becerilerinizi güçlendirmek için birçok projeden yararlanabilirsiniz. Bu projelerden biri, Python kullanarak basit bir push-up sayacı oluşturmaktır. Bu projenin programını tek bir dosyaya yazabilirsiniz.

Program bir video girişi veya bir kameradan gerçek zamanlı bir giriş alacak, giriş üzerinde insan pozu tahmini yapacak ve kişinin yaptığı şınav sayısını sayacaktır. İnsan pozu tahminini gerçekleştirmek için program MediaPipe insan pozu tahmin modelini kullanacaktır.

Google tarafından geliştirilmiş, insan vücudundaki otuz üç noktayı takip eden bir modeldir. Ayrıca, iki sınıflı bir bölümleme olarak temsil ettiği tam gövdeli bir bölümlemeyi de öngörür. Aşağıdaki görüntü, modelin tanımlayabildiği tüm yer işaretlerini göstermektedir. Numaralandırılmış noktalar, her bir yer işaretini tanımlar ve çizgilerle birbirine bağlanır.

instagram viewer
Resim Kredisi: MediaPipe/GitHub

Push-up counter programınız, omuzların ve dirseklerin pozisyonlarını kullanacaktır. Yukarıdaki resimde, omuz noktaları 11 ve 12, dirsek noktaları ise 13 ve 14'tür.

Ortamınızı Kurma

zaten aşina olmalısın Python'un temelleri. Bir Python IDE açın ve yeni bir Python dosyası oluşturun. İlgili paketleri ortamınıza kurmak için terminalde aşağıdaki komutu çalıştırın:

pip OpenCV-Python'u kurun

Programınızda video girişini alıp işlemek için OpenCV-Python kullanacaksınız. Bu kütüphane programınızı verir bilgisayar görme yetenekleri.

pip yükleme MediaPipe

Girişte insan pozu tahmini yapmak için MediaPipe'ı kullanacaksınız.

imutils'i kurun pip

Video girişini istediğiniz genişliğe yeniden boyutlandırmak için imutils'i kullanacaksınız.

Daha önce ortamınıza kurduğunuz üç kitaplığı içe aktarın. Bu, bağımlılıklarını projede kullanmayı mümkün kılacaktır.

içe aktarmak CV2
içe aktarmak imutils
içe aktarmak orta boru gibi mp

Ardından üç MediaPipe nesnesi oluşturun ve bunları ilgili işlevleri kullanarak başlatın. Girdi üzerinde çeşitli yer işaretlerini çizmek için mp.solutions.drawing_utilsfunction işlevini kullanacaksınız. yer işaretlerinin çizimlerinin göründüğü stilleri değiştirmek için mp.solutions.drawing_styles ve bu yer işaretlerini belirlemek için kullanacağınız model olan mp.solutions.pose.

mp_draw = mp.solutions.drawing_utils
mp_draw_styles = mp.solutions.drawing_styles
mp_pose = mp.solutions.pose

İnsan Poz Tahminini Gerçekleştirme

Bir insanın duruşunu tespit etmek, eklemlerini tanımlayıp sınıflandırarak vücut yönelimlerini belirleme sürecidir.

Değişkenlerinizi Bildirmek

Şınav sayısını, omuzların ve dirseklerin konumunu ve video girişini saklamak için kullanacağınız değişkenleri bildirin.

saymak = 0
pozisyon = Hiçbiri
büyük harf = cv2.VideoCapture("v4.mp4")

Konum değişkenini Yok olarak başlatın. Program, dirseklerin ve omuzların konumuna bağlı olarak güncelleyecektir.

Girdideki insan pozunu algılayacak olan MediaPipe poz tahmin modelini çağırın.

ile mp_pose. Poz(
min_detection_confidence = 0.7,
min_tracking_confidence = 0.7) gibi poz:

Algılama güveninin ve izleme güveninin başlangıç ​​değerleri, modelden ihtiyaç duyduğunuz doğruluk düzeyini temsil eder. 0.7, %70 doğruluğa benzer. İstediğiniz seviyeye değiştirebilirsiniz.

Girdiyi Alma ve Ön İşleme

Daha sonra poz tahmin modeline ileteceğiniz girdiyi alın. imutils kitaplığını kullanarak video girişinin genişliğini yeniden boyutlandırın. MediaPipe yalnızca RGB girişiyle çalıştığı için BGR'den girişi RGB'ye dönüştürün. Son olarak, yer işaretlerini belirlemek için dönüştürülen girdiyi insan pozu tahmin modeline iletin.

sırasında cap.isOpened():
başarı, image=cap.read()

eğerOlumsuz başarı:
Yazdır("boş kamera")
kırmak

resim = imutils.resize (resim, genişlik=500)
resim = cv2.cvtColor (cv2.flip (resim, 1), cv2.COLOR_BGR2RGB)
sonuç = poz.işlem (resim)

Girişi işledikten sonra, girişteki yer işaretlerini belirlediniz.

Girişte Belirlenen Yer İşaretlerinin Çizilmesi

Her yer işaretinin koordinatlarını saklayacak boş bir liste oluşturun. Draw_landmarks sınıfını kullanarak her yer işaretine bir nokta ve aralarındaki bağlantıları çizin. Bir for döngüsü kullanarak, yer işaretleri üzerinde yineleme yapın ve oluşturduğunuz listedeki her bir yer işaretinin kimliğini ve koordinatlarını saklayın. Video girişinin genişliğini ve yüksekliğini hesaplamak için image.shape sınıfını kullanın.

lmList = []

eğer sonuç.pose_landmarks:
# Yer işaretlerinin noktalarını çizer ve bunları birleştirir
mp_draw.draw_landmarks (resim, sonuç.pose_landmarks,
mp_pose. POSE_CONNECTIONS)

için kimlik, ben içinde numaralandırın (result.pose_landmarks.landmark):
# Video girişinin uzunluğunu ve genişliğini bulma
h, w, _ = resim.şekil

# Vücut noktalarının tam koordinatlarını bulma
X, Y = int (im.x * w), int (im.y * h)
lmList.append([kimlik, X, Y])

Kimlik, MediaPipe poz tahmin modeli tarafından belirli bir yer işaretine verilen sayıdır. Girdideki insanın pozunu belirledikten sonra, varsa yaptıkları şınav sayısını saymanız gerekir.

Şınav Sayısını Sayma

Omuzların konumunu dirseklerin konumuna göre kontrol eden bir koşul oluşturun. Girişteki kişinin omuzları dirseklerinden daha yüksekte olduğunda kişi yukarıdadır. Omuzlar dirseklerden aşağıda olduğunda, kişi aşağıdadır. Bunu, omuzların yer işaretlerinin kimliklerini dirseklerin yer işaretlerinin kimlikleriyle karşılaştırarak kontrol edebilirsiniz.

# Belirlenmiş herhangi bir yer işareti olup olmadığını kontrol etme
eğer len (lmList) != 0:
# Aşağı konumu tanımlayan koşul
eğer (lmList[12][2] Ve lmList[11][2] >= lmList[14][2] Ve lmList[13][2]):
pozisyon = "aşağı"

# Yukarı konumu tanımlayan koşul
eğer (lmList[12][2] Ve lmList[11][2] <= lmList[14][2] Ve lmList[13][2])
Ve pozisyon == "aşağı":
pozisyon = "yukarı"
saymak +=1

Bir kişinin tam bir şınav çekmesi için, aşağı pozisyon alması ve ardından tekrar yukarı pozisyona dönmesi gerekir. Tam bir şınavdan sonra, program sayımı birer birer güncelleyebilir.

Çıktıyı Görüntüleme

Programın saydığı şınav sayısını görüntülemeniz gerekir. Kullanıcı her tam şınav çektiğinde, sayımın değerini terminalde yazdırın. Son olarak, şınav çeken kişinin çıktısını vücuduna çizilen yer işaretleriyle gösterin.

 yazdır (sayım)

cv2.imshow("Push-up sayacı", cv2.flip (resim, 1))
anahtar = cv2.waitKey(1)

# q tuşuna basıldığında program sona erer
eğer anahtar == sıra('Q'):
kırmak

cap.release()

Çıktı şöyle görünmelidir:

Çıkıştaki kişi tam bir şınav çekerken terminalde bir güncelleme gözlemlemelisiniz.

Bilgisayarla Görme Becerilerinizi Güçlendirin

Bilgisayar görüşü geniştir. Push-up sayacı, bilgisayarla görme becerilerinizi uygulamaya koymak için kullanabileceğiniz birçok projeden biridir. Bu becerileri güçlendirmenin en iyi yolu, bilgisayar görüşünü içeren daha fazla proje oluşturmaktır.

Ne kadar çok proje inşa ederseniz, o kadar çok öğreneceksiniz!