diff --git a/.gitignore b/.gitignore
index 1fcb152..e29639e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,58 @@
-out
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+
+# C extensions
+*.so
+
+# Distribution / packaging
+bin/
+build/
+develop-eggs/
+dist/
+eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+out/
+*.egg-info/
+.installed.cfg
+*.egg
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+.tox/
+.coverage
+.cache
+nosetests.xml
+coverage.xml
+
+# Translations
+*.mo
+
+# Mr Developer
+.mr.developer.cfg
+.project
+.pydevproject
+
+# Rope
+.ropeproject
+
+# Django stuff:
+*.log
+*.pot
+
+# Sphinx documentation
+docs/_build/
+
+# Temp
+.venv/
+.vscode/
+
+# Config file
+src/config/config.json
\ No newline at end of file
diff --git a/md/nuts.md b/md/nuts.md
deleted file mode 100644
index 229a75b..0000000
--- a/md/nuts.md
+++ /dev/null
@@ -1,18 +0,0 @@
-### Jullie gaan noten herkennen
-
-Hoe de neuk? Nut.
-1. Hoe gaan we de noten herkennen (beeld, smaak, geluid, text)?
- - Beeldherkenning lol
-2. Wat zijn de visuele kenmerken van de noten?
- - Vorm, kleur, textuur, grootte
-3. Hoeveel noten willen we herkennen
- - Qua type, hoeveel verschillende noten
- - Qua tijd, hoeveel noten tegelijkertijd
-4. Wat is de achtergrond
-5. Met wat voor camera worden de noten bekeken
-6. Is de noot verwerkt
-
-De deelvragen moeten sequentieel zijn
-
-
-Wij moeten presenteren volgende week
diff --git a/src/config/config.template.json b/src/config/config.template.json
new file mode 100644
index 0000000..7594d9d
--- /dev/null
+++ b/src/config/config.template.json
@@ -0,0 +1,4 @@
+{
+ "path": "",
+ "size": 750
+}
\ No newline at end of file
diff --git a/src/adj.py b/src/experiments/adj.py
similarity index 100%
rename from src/adj.py
rename to src/experiments/adj.py
diff --git a/src/helpers/algorithms/canny_map.py b/src/experiments/algorithms/canny_map.py
similarity index 100%
rename from src/helpers/algorithms/canny_map.py
rename to src/experiments/algorithms/canny_map.py
diff --git a/src/helpers/algorithms/colourspace.py b/src/experiments/algorithms/colourspace.py
similarity index 100%
rename from src/helpers/algorithms/colourspace.py
rename to src/experiments/algorithms/colourspace.py
diff --git a/src/helpers/algorithms/image/test.jpg b/src/experiments/algorithms/image/test.jpg
similarity index 100%
rename from src/helpers/algorithms/image/test.jpg
rename to src/experiments/algorithms/image/test.jpg
diff --git a/src/helpers/algorithms/orb.py b/src/experiments/algorithms/orb.py
similarity index 100%
rename from src/helpers/algorithms/orb.py
rename to src/experiments/algorithms/orb.py
diff --git a/src/helpers/algorithms/sift.py b/src/experiments/algorithms/sift.py
similarity index 100%
rename from src/helpers/algorithms/sift.py
rename to src/experiments/algorithms/sift.py
diff --git a/src/helpers/algorithms/sift_v2.py b/src/experiments/algorithms/sift_v2.py
similarity index 100%
rename from src/helpers/algorithms/sift_v2.py
rename to src/experiments/algorithms/sift_v2.py
diff --git a/src/helpers/algorithms/sift_v3.py b/src/experiments/algorithms/sift_v3.py
similarity index 100%
rename from src/helpers/algorithms/sift_v3.py
rename to src/experiments/algorithms/sift_v3.py
diff --git a/src/tree_edge.py b/src/experiments/algorithms/tree_edge.py
similarity index 100%
rename from src/tree_edge.py
rename to src/experiments/algorithms/tree_edge.py
diff --git a/src/helpers/template_extraction/input/callibratie_recht.jpg b/src/experiments/template_extraction/input/callibratie_recht.jpg
similarity index 100%
rename from src/helpers/template_extraction/input/callibratie_recht.jpg
rename to src/experiments/template_extraction/input/callibratie_recht.jpg
diff --git a/src/helpers/template_extraction/input/callibratie_scheef.jpg b/src/experiments/template_extraction/input/callibratie_scheef.jpg
similarity index 100%
rename from src/helpers/template_extraction/input/callibratie_scheef.jpg
rename to src/experiments/template_extraction/input/callibratie_scheef.jpg
diff --git a/src/helpers/template_extraction/input/scheef.jpg b/src/experiments/template_extraction/input/scheef.jpg
similarity index 100%
rename from src/helpers/template_extraction/input/scheef.jpg
rename to src/experiments/template_extraction/input/scheef.jpg
diff --git a/src/helpers/template_extraction/input/template.jpg b/src/experiments/template_extraction/input/template.jpg
similarity index 100%
rename from src/helpers/template_extraction/input/template.jpg
rename to src/experiments/template_extraction/input/template.jpg
diff --git a/src/helpers/template_extraction/input/wood.jpg b/src/experiments/template_extraction/input/wood.jpg
similarity index 100%
rename from src/helpers/template_extraction/input/wood.jpg
rename to src/experiments/template_extraction/input/wood.jpg
diff --git a/src/helpers/template_extraction/script.py b/src/experiments/template_extraction/script.py
similarity index 100%
rename from src/helpers/template_extraction/script.py
rename to src/experiments/template_extraction/script.py
diff --git a/md/notes.md b/src/helpers/algorithms.py
similarity index 100%
rename from md/notes.md
rename to src/helpers/algorithms.py
diff --git a/src/helpers/algorithms/__pycache__/pysift.cpython-311.pyc b/src/helpers/algorithms/__pycache__/pysift.cpython-311.pyc
deleted file mode 100644
index 44f6a75..0000000
Binary files a/src/helpers/algorithms/__pycache__/pysift.cpython-311.pyc and /dev/null differ
diff --git a/src/gui/main.ui b/src/helpers/gui/main.ui
similarity index 91%
rename from src/gui/main.ui
rename to src/helpers/gui/main.ui
index 75d724a..05cdc74 100644
--- a/src/gui/main.ui
+++ b/src/helpers/gui/main.ui
@@ -5,6 +5,7 @@
800
Tree Recogniser 7000
200
+
false
@@ -175,9 +176,9 @@
-
-
- Prev img
-
+
+ Next img
+
2
10
@@ -213,7 +214,7 @@
2
- 2
+ 1
0
6
@@ -238,6 +239,22 @@
+
+
+ 10
+ 0
+ disabled
+ Image metadata should appear here
+ 25
+ word
+
+ 3
+ 1
+ 0
+ 8
+
+
+
diff --git a/src/suite.py b/src/suite.py
index a384aa3..2242a05 100644
--- a/src/suite.py
+++ b/src/suite.py
@@ -8,10 +8,18 @@ import numpy as np
import cv2
import time
import matplotlib.pyplot as plt
+import json
+## UI config load
PROJECT_PATH = pathlib.Path(__file__).parent
-PROJECT_UI = "./src/gui/main.ui"
+PROJECT_UI = "./src/helpers/gui/main.ui"
+## Config file load
+CONFIG_PATH = "./src/config/config.json"
+config_file = open(CONFIG_PATH)
+config_json = json.load(config_file)
+
+## UI class setup
class MainApp:
def __init__(self, master=None):
self.builder = builder = pygubu.Builder()
@@ -21,38 +29,51 @@ class MainApp:
# Main widget
self.mainwindow = builder.get_object("main", master)
+ # Canvas for output images
self.canvas = builder.get_object("output_canvas")
- self.tk_imgs = []
-
- self.canny_thr1 = None
- self.canny_thr2 = None
-
- self.img_path = None
+ self.tk_imgs = [] # Required or python will forget
+ self.output = [[] for x in range(2)]
+ self.meta = builder.get_object("dataset")
+
+ # Keep track of images in dataset
self.img_current = 0
self.img_max = 0
# Plots
self.axs = self.createPlot(2, 2)
- # UI
+ # UI Variables
+ self.canny_thr1 = None
+ self.canny_thr2 = None
+ self.img_path = None
self.blur_rate = None
self.img_size = None
self.sobel_select = None
self.export_id = None
- builder.import_variables(self,
- ['canny_thr1',
- 'canny_thr2',
- 'img_path',
- 'blur_rate',
- 'img_size',
- 'sobel_select',
- 'export_id'])
+ builder.import_variables(self, ['canny_thr1','canny_thr2','img_path','blur_rate','img_size', 'sobel_select', 'export_id'])
builder.connect_callbacks(self)
+
+ # Load values from config after UI has been initialised
+ self.img_path.set(config_json["path"])
+ self.img_size.set(config_json["size"])
+
+ def on_quit(self, event=None):
+ '''
+ Close PLT windows on main app quit
+ '''
+ plt.close()
+ self.mainwindow.quit();
def run(self):
+ '''
+ Run loop
+ '''
self.mainwindow.mainloop()
def img_prev(self, event=None):
+ '''
+ Open previous image from path
+ '''
if self.img_current == 0:
self.img_current = self.img_max - 1
else:
@@ -60,6 +81,9 @@ class MainApp:
self.update(self)
def img_next(self, event=None):
+ '''
+ Open next image from path
+ '''
if self.img_current == (self.img_max - 1):
self.img_current = 0
else:
@@ -67,6 +91,9 @@ class MainApp:
self.update(self)
def apply(self, event=None):
+ '''
+ Export current dataset
+ '''
img_arr = self.tk_imgs
img_id = self.export_id.get()
@@ -75,10 +102,58 @@ class MainApp:
else:
print("Nothing to export!")
+ def add_output(self, data, name: str):
+ '''
+ Add CV2 image to canvas output
+ '''
+ self.output[0].append(data)
+ self.output[1].append(name)
+
+ def draw_output(self, size):
+ # Check if size of canvas has updated
+ drawW = self.canvas.winfo_width()
+
+ # Reset drawing position
+ drawX = 0
+ drawY = 0
+
+ # Clear previously printed images
+ self.tk_imgs = []
+
+ self.meta.config(state=NORMAL)
+ self.meta.delete(1.0, END)
+
+ # Draw all output images
+ for idx, data in enumerate(self.output[0]):
+ # Create ui image
+ tk_img = cv2.cvtColor(data, cv2.COLOR_BGR2RGB)
+ tk_img = ImageTk.PhotoImage(image=Image.fromarray(tk_img))
+ self.tk_imgs.append(tk_img)
+
+ ## Check if next item will be out of range
+ if (drawX + size >= drawW):
+ drawY += size
+ drawX = 0
+ self.canvas.configure(height=(drawY+size))
+
+ self.canvas.create_image(drawX,drawY,anchor=NW,image=self.tk_imgs[idx],tags="og")
+ drawX += size
+
+ # Add name to text box
+ self.meta.insert(END, F"{idx}: {self.output[1][idx]}\n")
+
+ # Clear output
+ self.output = [[] for x in range(2)]
+ self.meta.config(state=DISABLED)
+
+ # Draw canvas
+ # TODO IDK volgens mij moet je deze wel callen maar het programma doet het nog (geen vragen stellen)
+ # self.canvas.draw()
+
def createPlot(self, columns, rows):
fig, axs = plt.subplots(columns, rows)
return axs
-
+
def drawHist(self, image, labels, column, row):
self.axs[column, row].clear()
for i,lab in enumerate(labels):
@@ -120,11 +195,6 @@ class MainApp:
def update(self, event=None):
path = self.img_path.get()
- print(path)
-
- drawW = self.canvas.winfo_width()
- drawX = 0
- drawY = 0
if path != None and path != "":
# Get all images at current path
@@ -141,31 +211,24 @@ class MainApp:
sxy = self.sobel_select.get()
size = self.img_size.get()
- # Keep array of cv2 images to output
- output = []
-
- # Clear previously printed images
- self.tk_imgs = []
-
# Import and resize image
img = cv2.imread(images[self.img_current])
img = cv2.resize(img, (size, size), interpolation = cv2.INTER_AREA)
- output.append(img) # First output image is original
+ self.add_output(img, "Original")
# Set grayscale
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
- output.append(img_gray) # Second output is grayscale
+ self.add_output(img_gray, "Grayscale")
# Blurred edition
if (br == 0):
- # Disable
img_blur = img_gray
elif (br % 2 == 1):
img_blur = cv2.GaussianBlur(img_gray, (br, br), 0)
else:
print(f"Blur rate changed to {br - 1}")
img_blur = cv2.GaussianBlur(img_gray, (br-1, br-1), 0)
- output.append(img_blur)
+ self.add_output(img_blur, "Blurred")
# Sobel edge
if sxy in ['x', 'y', 'both']:
@@ -181,49 +244,37 @@ class MainApp:
img_sobel = cv2.Sobel(src=img_blur, ddepth=cv2.CV_8U, dx=dx, dy=dy, ksize=5)
else:
- img_sobel = img_gray
- output.append(img_sobel)
+ img_sobel = img_gray
+ self.add_output(img_sobel, "Sobel Edge")
# Canny edge
img_canny = cv2.Canny(image=img_blur,threshold1=ct1,threshold2=ct2)
- output.append(img_canny)
+ self.add_output(img_canny, "Canny Edge")
# BGR
- output.append(img[:, :, 0]) # B
- output.append(img[:, :, 1]) # G
- output.append(img[:, :, 2]) # R
+ self.add_output(img[:, :, 0], "BGR B")
+ self.add_output(img[:, :, 1], "BGR G")
+ self.add_output(img[:, :, 2], "BGR R")
+
if img is not None:
self.drawHist(img, ('B', 'G', 'R'), 0, 0)
# HSV
img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
- output.append(img_hsv)
- output.append(img_hsv[:, :, 0]) # H
- output.append(img_hsv[:, :, 1]) # S
- output.append(img_hsv[:, :, 2]) # V
+ self.add_output(img_hsv, "HSV")
+ self.add_output(img_hsv[:, :, 0], "HSV H") # H
+ self.add_output(img_hsv[:, :, 1], "HSV S") # S
+ self.add_output(img_hsv[:, :, 2], "HSV V") # V
+
if img_hsv is not None:
self.drawHist(img_hsv, ('H', 'S', 'V'), 0, 1)
+ # Canny Heatmap
self.drawCannyHM(img, 1, 1)
-
- plt.show(block=False)
- # Draw all output images
- for idx, data in enumerate(output):
- # Create ui image
- tk_img = cv2.cvtColor(data, cv2.COLOR_BGR2RGB)
- tk_img = ImageTk.PhotoImage(image=Image.fromarray(tk_img))
- self.tk_imgs.append(tk_img)
-
- ## Check if next item will be out of range
- if (drawX + size >= drawW):
- drawY += size
- drawX = 0
- self.canvas.configure(height=(drawY+size))
-
- self.canvas.create_image(drawX,drawY,anchor=NW,image=self.tk_imgs[idx],tags="og")
- drawX += size
- self.canvas.draw()
+ # Show all data
+ plt.show(block=False) ## Graphs
+ self.draw_output(size) ## Images
if __name__ == "__main__":
app = MainApp()