It is here: Under the Magical Sky

It is here…

After a year of hard work and dedication, we are pleased to announce the launch of our first book and brand new website! Under the magical is finally here!

We are very proud of the result, excited about the future and so grateful for the opportunity to make a difference.

We are deeply passionate about creativity and arts, but can’t ignore the fact that millions of children face the least stable living and learning circumstances every day. That’s why we have decided that every time you purchase at Under the Magical Sky, we will donate to those in need.

Now, we invite you all to visit our site: https://underthemagicalsky.com/

Under The Magical Sky. By Valeria Bressan and Tauno Erik

Continuous image capture from webcam

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:

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

def file_exists(filepath):
    Returns true if file exists, false otherwise.
        f = open(filepath, 'r')
        exists = True
        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

        # 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
                    (round(resized.shape[1] / 2) - 15, round(resized.shape[0] / 2)+10),
                    (255, 255, 255))

        # Display raw camera image
        cv2.imshow('Kaamera', copy)

        # Press 'q' to exit
        if cv2.waitKey(10) == ord('q'):

    # Clean up

if __name__ == "__main__":
    print('To exit press "q"')

Original code: https://github.com/ShawnHymel/computer-vision-with-embedded-machine-learning/blob/master/1.1.3%20-%20Data%20Collection/Raspberry%20Pi/pi-cam-capture.py

Spurkfun Edge and Camera

My Arduino settings and code to use Sparkfun Edge with the camera module.


  • Sparkfun Edge (Input only 3.3V.)
  • Himax CMOS Imaging Camera – HM01B0
  • Wemos CH340G USB to serial (Make sure it output is 3.3V!)
Spurkfun Edge

In Arduino IDE

  • Add Boards Manager URL: https://raw.githubusercontent.com/sparkfun/Arduino_Boards/master/IDE_Board_Manager/package_sparkfun_index.json
  • Install SparkFun Apollo3 Boards package
  • Install SparkFun Himax HM01B0 Cameras library


Arduino settings

Upload sketch

  • Press and hold the Reset button
  • Press and hold the 14 button
  • Release the Reset button
  • Hold the 14 button and hit Upload in the Arduino IDE

If it is successful you will see this message:

Read images

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):


Kõnnõtoro ehk ruupor


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.

Versioon 1

Versioon 2