As part of an online course, I currently take “Computer Vision with Embedded Machine Learning” where is need to collect images to make the dataset. I modified the original code so I can use my regular Linux box and webcam, not Raspberry Pi. The programme counts down and saves images every 7 seconds. That is enough time to change the object position. It also crops and resizes images to 96×96 px size as needed.
This is my setup:

Example images from created dataset:

And my code:
#!/usr/bin/env python3
"""
Image Capture
Displays image preview on screen.
Counts down and saves image 96*96px.
Restarts count down.
To exit press "q".
06.09.2021 Tauno Erik
"""
import cv2
import numpy as np
# Settings
file_num = 0
save_path = "./" # Save images to current directory
file_suffix = ".png" # Extension for image file
SECONDS_TO_COUNTDOWN = 7
def file_exists(filepath):
"""
Returns true if file exists, false otherwise.
"""
try:
f = open(filepath, 'r')
exists = True
f.close()
except:
exists = False
return exists
def get_filepath():
"""
Returns the next available full path to image file
"""
global file_num
# Loop through possible file numbers to see if that file already exists
filepath = save_path + str(file_num) + file_suffix
while file_exists(filepath):
file_num += 1
filepath = save_path + str(file_num) + file_suffix
return filepath
def main():
countdown = SECONDS_TO_COUNTDOWN
# Figure out the name of the output image filename
filepath = get_filepath()
cam = cv2.VideoCapture(0)
# Set smaller resolution
#cam.set(cv2.CAP_PROP_FRAME_WIDTH, 160) # 640
#cam.set(cv2.CAP_PROP_FRAME_HEIGHT, 120) # 480
# Initial countdown timestamp
countdown_timestamp = cv2.getTickCount()
while cam.isOpened():
# Read camera
ret, frame = cam.read()
# Get timestamp for calculating actual framerate
timestamp = cv2.getTickCount()
# Each second, decrement countdown
if (timestamp - countdown_timestamp) / cv2.getTickFrequency() > 1.0:
countdown_timestamp = cv2.getTickCount()
countdown -= 1
# When countdown reaches 0, break out of loop to save image
if countdown <= 0:
# Get new image file name
filepath = get_filepath()
# Save image
cv2.imwrite(filepath, resized)
# Start new count down
countdown = SECONDS_TO_COUNTDOWN
#break
# Frame resolution
frame_height = frame.shape[0]
frame_width = frame.shape[1]
# Crop center of image
new_size = 98
start_y = int(frame_height/2 - new_size/2)
end_y = int(frame_height/2 + new_size/2)
start_x = int(frame_width/2 - new_size/2)
end_x = int(frame_width/2 + new_size/2)
# Crop
cropped = frame[start_y:end_y, start_x:end_x]
# Rezise to 96*96
resized = cv2.resize(cropped, (96,96), interpolation=cv2.INTER_CUBIC)
# Put text only on copied image
copy = resized.copy()
# Draw countdown on image
cv2.putText(copy,
str(countdown),
(round(resized.shape[1] / 2) - 15, round(resized.shape[0] / 2)+10),
cv2.FONT_HERSHEY_PLAIN,
4,
(255, 255, 255))
# Display raw camera image
cv2.imshow('Kaamera', copy)
# Press 'q' to exit
if cv2.waitKey(10) == ord('q'):
break
# Clean up
cam.release()
cv2.destroyAllWindows()
if __name__ == "__main__":
print('To exit press "q"')
main()