| import cv2 | |
| from cvzone.HandTrackingModule import HandDetector | |
| import numpy as np | |
| import math | |
| import time | |
| cap = cv2.VideoCapture(0) | |
| detector = HandDetector(maxHands=1) | |
| offset = 20 | |
| imgSize = 300 | |
| folder = "Data/Hi" | |
| counter = 0 | |
| while True: | |
| success, img = cap.read() | |
| if not success: | |
| print("Failed to capture image") | |
| continue | |
| hands, img = detector.findHands(img) | |
| if hands: | |
| hand = hands[0] | |
| x, y, w, h = hand['bbox'] | |
| imgWhite = np.ones((imgSize, imgSize, 3), np.uint8) * 255 | |
| try: | |
| imgCrop = img[y - offset:y + h + offset, x - offset:x + w + offset] | |
| if imgCrop.size == 0: | |
| raise ValueError("Empty image crop detected") | |
| imgCropShape = imgCrop.shape | |
| aspectRatio = h / w | |
| if aspectRatio > 1: | |
| k = imgSize / h | |
| wCal = math.ceil(k * w) | |
| imgResize = cv2.resize(imgCrop, (wCal, imgSize)) | |
| imgResizeShape = imgResize.shape | |
| wGap = math.ceil((imgSize - wCal) / 2) | |
| imgWhite[:, wGap:wCal + wGap] = imgResize | |
| else: | |
| k = imgSize / w | |
| hCal = math.ceil(k * h) | |
| imgResize = cv2.resize(imgCrop, (imgSize, hCal)) | |
| imgResizeShape = imgResize.shape | |
| hGap = math.ceil((imgSize - hCal) / 2) | |
| imgWhite[hGap:hCal + hGap, :] = imgResize | |
| cv2.imshow("ImageCrop", imgCrop) | |
| cv2.imshow("ImageWhite", imgWhite) | |
| except cv2.error as e: | |
| print("OpenCV error:", e) | |
| except ValueError as e: | |
| print(e) | |
| cv2.imshow("Image", img) | |
| key = cv2.waitKey(1) | |
| if key == ord("s"): | |
| if imgCrop.size == 0: | |
| continue | |
| counter += 1 | |
| cv2.imwrite(f'{folder}/Image_{time.time()}.jpg', imgWhite) | |
| print(counter) | |