Aktionen

BP

BP:Würfelstatistik

Aus Physik und ihre Didaktik Wiki


In diesem Projekt geht es um Statistik. Hierbei wird ein Programm entwickelt, was einem erlaubt, mithilfe einer Kamera die Augenzahl von bis zu 100 Würfeln gleichzeitig auszulesen.

Dieses Bild zeigt 50 Würfel, die vom Programm ausgelesen wurden und deren Augenzahl zugeordnet wurde.
Allgemein
Klassenstufe Klasse 9/10
Kategorie Sonstiges
Einordnung in den Bildungsplan von BW 3.3.4. Struktur der Materie, (2) Kernzerfälle und ionisierende Strahlung beschreiben

Didaktischer Rahmen

Fachdidaktische Zielsetzung

Mit diesem Experiment können in der Physik beispielsweise radioaktive Zerfallsprozesse visualisiert werden. Je nachdem, welche Zerfallskonstante verwendet werden soll, können beispielsweise alle 6en (Zerfallskonstante 1/6) oder alle ungeraden Zahlen (Zerfallskonstante 1/2) anschließend entfernt werden und mit den verbleibenden Würfeln weiter gewürfelt und der Vorgang wiederholt werden.


Nötige Vorkenntnisse

Die SuS sollten schon über radioaktive Zerfallsprozesse Bescheid wissen, damit der Transfer zum Würfelmodell gelingen kann.

Schülervorstellungen, die hier relevant werden

Eine Schüler(fehl)vorstellung, die hier auftreten könnte, ist, dass die SuS glauben könnten, dass, wenn in einem Durchgang viele 2er gewürfelt worden sind, im nächsten Durchgang automatisch weniger 2er gewürfelt werden, da sich das statistisch ausgleichen muss, weil ja alle Würfelseiten die gleiche Wahrscheinlichkeit haben.


Versuchsanleitung

Benötigtes Material

  • Würfel
  • Smartphone oder Kamera
  • Laptop mit Python und openCV
  • Homogener, heller Untergrund
Das Bild zeigt die benötigten Materialien für das Projekt: einen Laptop auf dem Python läuft, ein Handy mit Kamerafunktion und 100 Würfel.

Versuchsaufbau und -durchführung

Schritt 1: Auf einem Tisch wird die gewünschte Anzahl an Würfeln gewürfelt.

Schritt 2: Nach dem Würfeln werden die Würfel in einem Abstand von circa 5 cm voneinander platziert.

Schritt 3: Nun kann ein Bild von den Würfeln gemacht werden. Dabei muss darauf geachtet werden, dass möglichst zentral über den Würfeln fotografiert wird. Am besten eignet sich eine Höhe von 80 – 100 cm über den Würfeln. Der Dateiname des Bildes wird in das Programm eingetragen.

Schritt 4: Das Programm kann jetzt gestartet werden und die Ergebnisse werden ausgewertet.


Auswertung

Wie in den nebenstehenden Abbildungen zu sehen, gibt das Programm die Anzahl der Würfel und die Anzahl der Augenzahlen in Textform aus. Zudem wird ein Diagramm mit der Verteilung der Augenzahlen angezeigt. In einer zusätzlichen Datei wird ein Bild geöffnet, bei dem gezeigt wird, welche Augenzahl, welchem Würfel zugeordnet wurde.

Das Bild zeigt 100 Würfel, die vom Programm ausgelesen wurden und deren Augenzahl zugeordnet wurde.
Das Bild zeigt die Ausgabe der Konsole in Python.
Das Bild zeigt die Verteilung der Würfel, die in Python ausgegeben wird.

Mögliche Probleme und ihre Lösungen

  • Die Seiten der Würfel werden auch erkannt
  • Mehrere Würfel werden als ein Würfel erkannt
  • 2er werden als zwei 1er erkannt

Um die Fehler zu beheben kann es helfen die Höhe aus der fotografiert wird zu ändern. Bei dem Problem mit den 2ern hilft es von weiter weg zu fotografieren, bei dem Problem, bei dem mehrere Würfel als ein Würfel erkannt werden, hilft es etwas näher heranzugehen. Bei dem letzteren Problem hilft es außerdem, die Würfel mit einem größeren Abstand zueinander zu positionieren. Falls die Seiten auch erkannt werden, kann ebenfalls der Abstand vergrößert werden oder das Smartphone noch zentraler über den Würfeln ausgerichtet werden. Es kann zudem hilfreich sein, die Würfel besser auszuleuchten, jedoch ohne, dass die Lichtquelle an den Würfel reflektiert wird.


Programmbeschreibung

Programm

Nach dem Importieren der benötigten Programme, wird das Bild eingefügt. Dabei wird der Dateiname des Bildes, das ausgelesen werden soll in die imread-Funktion eingefügt. Anschließend wird eine resize-Funktion angewendet, damit das Bild die richtige Größe hat und nicht verzerrt wird. Anschließend werden die Parameter definiert, nach welchen auf dem Bild die Würfel und Augenzahl detektiert werden sollen.

In der get_blobs- Funktion wird zunächst ein Graufilter auf das Bild gelegt und anschließend werden alle auffälligen Punkte (Blobs) detektiert.

In der getdicefromblobs Funktion wird zunächst jedem Blob eine Position zugeschrieben. Mithilfe der Cluster-Funktion wird die Würfelanzahl bestimmt. Danach werden die Augenzahlen der Würfel detektiert. Nun wird ausgewertet, welche Augenzahl wie oft gewürfelt wurde und der Plot für das Diagramm der Verteilung erstellt.

In der Overlay-Funktion wird die Anzahl an detektierten Punkten hervorgehoben und daneben wird der Zahlenwert der Augenzahl der Würfel angezeigt.

Zuletzt werden die zuvor definierten Funktionen ausgeführt und das entstandene Bild mit der imwrite-Funktion gespeichert.

# -*- coding: utf-8 -*-
"""
Created on Mon Jul  3 10:02:11 2023

@author: Celine
"""

import cv2
import time
import numpy as np
from sklearn import cluster
import matplotlib.pyplot as plt

img = cv2.imread('100.3.jpeg')
resize = cv2.resize(img, (img.shape[1],img.shape[0]))

params = cv2.SimpleBlobDetector_Params()

params.filterByInertia
params.minInertiaRatio = 0.6

detector = cv2.SimpleBlobDetector_create(params)

def get_blobs(frame):
    #blur = cv2.medianBlur(frame, 7)
    gray = cv2.cvtColor(resize, cv2.COLOR_BGR2GRAY)
    blobs = detector.detect(gray)

    return blobs

def get_dice_from_blobs(blobs):
    # Get centroids of all blobs
    X = []
    for b in blobs:
        pos = b.pt

        if pos != None:
            X.append(pos)

    X = np.asarray(X)

    if len(X) > 0:
        # Important to set min_sample to 0, as a dice may only have one dot
        clustering = cluster.DBSCAN(eps=40, min_samples=0).fit(X)

        # Find the largest label assigned + 1, that's the number of dice found
        num_dice = max(clustering.labels_) + 1

        print('Es wurden', num_dice, 'Würfel gewürfelt.')

        dice = []
        
        augenzahl = []
        
        anzahl=[]
        # Calculate centroid of each dice, the average between all a dice's dots
        for i in range(num_dice):
            X_dice = X[clustering.labels_ == i]

            centroid_dice = np.mean(X_dice, axis=0)

            dice.append([len(X_dice), *centroid_dice])
            
            augenzahl.append(len(X_dice))
                    
        for i in range(1,7):
            s = augenzahl.count(i)
            anzahl.append(s)
               
        xwerte = [1,2,3,4,5,6]
        
        plt.bar(xwerte, anzahl)
        plt.xlabel("Augenzahl")
        plt.ylabel("Häufigkeit der Augenzahl")
        plt.title('Verteilung der Würfelaugenzahlen')
        plt.show()
        
        print('Es wurden', anzahl[0], 'Einsen,',
               anzahl[1], 'Zweien,',
               anzahl[2], 'Dreien,',
               anzahl[3], 'Vieren,',
               anzahl[4], 'Fünfen und',
               anzahl[5], 'Sechsen gewürfelt.')

        return dice       

    else:
        return []

def overlay_info(frame, dice, blobs):
    # Overlay blobs
    for b in blobs:
        pos = b.pt
        r = b.size / 2

        cv2.circle(frame, (int(pos[0]), int(pos[1])),
                   int(r), (255, 0, 0), 2)

    # Overlay dice number
    for d in dice:
        # Get textsize for text centering
        textsize = cv2.getTextSize(
            str(d[0]), cv2.FONT_HERSHEY_PLAIN, 3, 2)[0]

        cv2.putText(frame, str(d[0]),
                    (int(d[1] - textsize[0] / 2),
                     int(d[2] + textsize[1] / 2)),
                    cv2.FONT_HERSHEY_PLAIN, 3, (0, 255, 0), 2)
        
#print('Gib den Dateinamen des auszuwertenden Bildes ein:')
#x = input('Gib den Dateinamen des auszuwertenden Bildes ein:')               

blobs = get_blobs(resize)
dice = get_dice_from_blobs(blobs)
out_frame = overlay_info(resize, dice, blobs)

#cv2.imshow('image', resize)
cv2.imwrite('C:/Users\Celine\Documents\Studium\Semester 8\FD Physik 3\Ausgabe.jpeg', resize)
cv2.waitKey(0)
cv2.destroyAllWindows()

Fotos


  • slide 1
        50 Würfel
    
  • slide 2
         Materialien
    
  • slide 3
        100 Würfel
    
  • slide 4
        Ausgabe
    
  • slide 5
        Diagramm
    


88x31.png Universität Stuttgart, 5. Physikalisches Institut, AG Physik und ihre Didaktik, lizenziert unter CC BY-NC-SA 4.0