Đếm số lần chống đẩy bằng Python và máy ảnh trên máy tính của bạn
Bạn có thể sử dụng nhiều dự án để củng cố kỹ năng của mình về thị giác máy tính và Python. Một trong những dự án này là tạo bộ đếm chống đẩy đơn giản bằng Python. Bạn có thể viết chương trình của dự án này trong một tệp duy nhất.
Chương trình sẽ lấy đầu vào video hoặc đầu vào thời gian thực từ máy ảnh, thực hiện ước tính tư thế của con người trên đầu vào và đếm số lần chống đẩy mà người đó đang thực hiện. Để thực hiện ước tính tư thế người, chương trình sẽ sử dụng mô hình ước tính tư thế người MediaPipe.
Đó là một mô hình do Google phát triển để theo dõi ba mươi ba điểm mốc trên cơ thể con người. Nó cũng dự đoán một phân khúc toàn thân mà nó đại diện là một phân khúc hai lớp. Hình ảnh sau đây cho thấy tất cả các mốc mà mô hình có khả năng xác định. Các điểm được đánh số xác định từng mốc và kết nối với nhau bằng các đường.
Chương trình chống đẩy của bạn sẽ sử dụng các vị trí của vai và khuỷu tay. Trong hình trên, mốc vai là 11 và 12 trong khi mốc khuỷu tay là 13 và 14.
Mục Lục
Thiết lập môi trường của bạn
Bạn đã quen thuộc với những kiến thức cơ bản về Python. Mở một IDE Python và tạo một tệp Python mới. Chạy lệnh sau trên thiết bị đầu cuối để cài đặt các gói tương ứng trên môi trường của bạn:
pip install OpenCV-Python
Bạn sẽ sử dụng OpenCV-Python để lấy đầu vào video trong chương trình của bạn và xử lý nó. Thư viện này cung cấp cho chương trình của bạn khả năng thị giác máy tính.
pip install MediaPipe
Bạn sẽ sử dụng MediaPipe để thực hiện ước tính tư thế người trên đầu vào.
pip install imutils
Bạn sẽ sử dụng imutils để thay đổi kích thước đầu vào video theo chiều rộng mong muốn của mình.
Nhập ba thư viện mà bạn đã cài đặt trước đó trên môi trường của mình. Điều này sẽ làm cho nó có thể sử dụng các phụ thuộc của họ trong dự án.
import cv2
import imutils
import mediapipe as mp
Sau đó, tạo ba đối tượng MediaPipe và khởi tạo chúng bằng các hàm tương ứng. Bạn sẽ sử dụng mp.solutions.drawing_utils để vẽ các mốc khác nhau trên đầu vào. mp.solutions.drawing_styles để thay đổi kiểu hiển thị bản vẽ của các mốc và mp.solutions.pose là mô hình bạn sẽ sử dụng để xác định các mốc này.
mp_draw = mp.solutions.drawing_utils
mp_draw_styles = mp.solutions.drawing_styles
mp_pose = mp.solutions.pose
Thực hiện ước tính tư thế con người
Phát hiện tư thế của con người là quá trình xác định hướng cơ thể của họ bằng cách xác định và phân loại các khớp của họ.
Khai báo các biến của bạn
Khai báo các biến bạn sẽ sử dụng để lưu trữ số lần chống đẩy, vị trí của vai và khuỷu tay cũng như đầu vào video.
count = 0
position = None
cap = cv2.VideoCapture("v4.mp4")
Khởi tạo biến vị trí thành Không có. Chương trình sẽ cập nhật nó tùy thuộc vào vị trí của khuỷu tay và vai.
Gọi Mô hình Ước tính Tư thế MediaPipe
Gọi mô hình ước tính tư thế MediaPipe sẽ phát hiện tư thế của con người trong đầu vào.
with mp_pose.Pose(
min_detection_confidence = 0.7,
min_tracking_confidence = 0.7) as pose:
Việc khởi tạo độ tin cậy phát hiện và độ tin cậy theo dõi thể hiện mức độ chính xác mà bạn cần từ mô hình. 0,7 tương đương với độ chính xác 70%. Bạn có thể thay đổi nó thành cấp độ mong muốn của bạn.
Lấy và tiền xử lý đầu vào
Lấy đầu vào mà sau này bạn sẽ chuyển đến mô hình ước tính tư thế. Thay đổi kích thước chiều rộng của đầu vào video bằng thư viện imutils. Chuyển đổi đầu vào từ BGR sang RGB vì MediaPipe chỉ hoạt động với đầu vào RGB. Cuối cùng, chuyển đầu vào đã chuyển đổi sang mô hình ước tính tư thế con người để xác định các mốc.
while cap.isOpened():
success, image=cap.read() if not success:
print("empty camera")
break
image = imutils.resize(image, width=500)
image = cv2.cvtColor(cv2.flip(image, 1), cv2.COLOR_BGR2RGB)
result = pose.process(image)
Sau khi xử lý đầu vào, bạn đã xác định được các mốc trên đầu vào.
Vẽ các mốc đã xác định trên đầu vào
Tạo một danh sách trống sẽ lưu trữ tọa độ của từng mốc. Sử dụng lớp draw_landmarks để vẽ một dấu chấm trên mỗi mốc và các kết nối giữa chúng. Sử dụng vòng lặp for, lặp qua các mốc và lưu trữ ID và tọa độ của từng mốc trong danh sách bạn đã tạo. Sử dụng lớp image.shape để tính chiều rộng và chiều cao của đầu vào video.
lmList = []if result.pose_landmarks:
mp_draw.draw_landmarks(image, result.pose_landmarks,
mp_pose.POSE_CONNECTIONS)
for id, im in enumerate(result.pose_landmarks.landmark):
h, w, _ = image.shape
X, Y = int(im.x * w), int(im.y * h)
lmList.append([id, X, Y])
ID là số được cung cấp cho một mốc cụ thể theo mô hình ước tính tư thế MediaPipe. Khi đã xác định được tư thế của con người trong đầu vào, bạn cần đếm số lần chống đẩy mà họ đang thực hiện nếu có.
Đếm số lần chống đẩy
Tạo điều kiện kiểm tra vị trí của vai so với vị trí của khuỷu tay. Khi vai của người trong đầu vào cao hơn khuỷu tay thì người đó đứng dậy. Khi vai thấp hơn khuỷu tay, người đó đang cúi xuống. Bạn kiểm tra điều này bằng cách so sánh ID của các mốc của vai với ID của các mốc của khuỷu tay.
if len(lmList) != 0:
if (lmList[12][2] and lmList[11][2] >= lmList[14][2] and lmList[13][2]):
position = "down"
if (lmList[12][2] and lmList[11][2] <= lmList[14][2] and lmList[13][2])
and position == "down":
position = "up"
count +=1
Để một người hoàn thành một lần chống đẩy hoàn toàn, họ phải ở tư thế nằm xuống và sau đó quay trở lại tư thế đứng. Sau khi đẩy lên hoàn chỉnh, chương trình có thể cập nhật số lượng từng cái một.
Hiển thị đầu ra
Bạn cần hiển thị số lần chống đẩy mà chương trình đã đếm. In giá trị của số đếm trên thiết bị đầu cuối, mỗi khi người dùng thực hiện một động tác chống đẩy hoàn chỉnh. Cuối cùng, hiển thị đầu ra của người chống đẩy với các mốc được vẽ trên cơ thể họ.
print(count) cv2.imshow("Push-up counter", cv2.flip(image, 1))
key = cv2.waitKey(1)
if key == ord('q'):
break
cap.release()
Đầu ra sẽ trông giống như thế này:
Bạn nên quan sát cập nhật trên thiết bị đầu cuối khi người ở đầu ra thực hiện động tác chống đẩy hoàn chỉnh.
Tăng cường kỹ năng thị giác máy tính của bạn
Tầm nhìn máy tính rất rộng. Bộ đếm chống đẩy là một trong nhiều dự án bạn có thể sử dụng để thực hành các kỹ năng thị giác máy tính của mình. Cách tốt nhất để củng cố những kỹ năng này là xây dựng nhiều dự án liên quan đến thị giác máy tính.
Bạn sẽ xây dựng càng nhiều dự án, bạn sẽ càng học được nhiều hơn!