


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()
My Arduino settings and code to use Sparkfun Edge with the camera module.

https://raw.githubusercontent.com/sparkfun/Arduino_Boards/master/IDE_Board_Manager/package_sparkfun_index.jsonSparkFun Apollo3 Boards packageSparkFun Himax HM01B0 Cameras library
If it is successful you will see this message:

Board default Serial Baudrate is 460800.
Example Python code is utils/StopMotion.py.
Run this to save images on same directory:
./StopMotion.py -p /dev/ttyUSB0 -o .
First you see something this. When I first tried this it was all I get. Only these numbers forever. Then on the next day I came back, hooked it up and miraculous it started to work.

Positive output


Example image (bmp):

Tuntud inimene, kes võru keeles kõnet peab (või teeb mõne muu teo, mis toetab võru keelt), kannaks tema ametit toetavat atribuuti. See peaks sobima kanda nii mehele kui ka naisele. Praegu on sõelale jäänud kolm eset: (jalutus)kepp, kaelaraha ja ruupor (ehk kõnnõtoro). Oleme mõelnud, et ruupor võiks meenutada Pähni kõlakodasid.

Soovime Tsentrilt tellida puidust/vineerist ruupori kavandi ja töö. Ruupor võiks olla kaheksatahuline, sang küljes. Kuhugi külge peaks saama siduda rahvariidevöö. Ruupor võiks olla 35-40 (50) cm pikk, kerge ja igale tahule võiks kirjutada ühe vana Võrumaa kihelkonna nime: Räpinä, Vahtsõliina, Rõugõ, Harglõ, Karula, Urvastõ, Kanepi, Põlva. Võite ka omalt poolt välja pakkuda, kuidas seda oleks sobilik võrumaalikult kaunistada.