Parameter einstellen mit tkinter slider

Fragen zu Tkinter.
Antworten
Interpreter67
User
Beiträge: 14
Registriert: Samstag 24. Oktober 2020, 16:42

Hallo,

und zwar mache ich Bildverarbeitung mit Open Cv. Das heißt ich lese ein Bild ein und möchte zum Beispiel die Helligkeit einstellen. Die Helligkeit möchte ich aber nicht direkt im Programm selber sondern mit dem slider von Tkinter einstellen. Dazu hab ich schon ein Programm geschrieben, welches mein Bild einliest und bearbeitet und ich habe auch schon den slider erzeugt . Jetzt muss ich nur noch den slider mit einem der Parameter von OPen Cv verbinden. Und da komm ich mehr weiter. Hier ist mein bisheriges Programm:

Code: Alles auswählen

from tkinter import *
import cv2 as cv

def button_action():
    img = cv.imread("img.jpg")
    scale_percent = 40  # percent of original size
    width = int(img.shape[1] * scale_percent / 100)
    height = int(img.shape[0] * scale_percent / 100)
    dim = (width, height)
    img = cv.resize(img, dim, interpolation=cv.INTER_AREA)

    gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
    edges = cv.adaptiveThreshold(gray, 255, cv.ADAPTIVE_THRESH_MEAN_C, cv.THRESH_BINARY, 7, 15)
    cv.imshow("cartoon", edges)
    cv.waitKey(0)
    cv.destroyAllWindows()

def show_values():
    print (w1.get(), w2.get())

master = Tk()
w1 = Scale(master, from_=0, to=42)
w1.set(0)
w1.pack()
w2 = Scale(master, from_=0, to=200, orient=HORIZONTAL)
w2.set(0)
w2.pack()

change_button5 = Button(master, text="gray", command=button_action)
change_button5.pack()


mainloop()
Hier würde ich also gerne vom adaptive threshhold die letzten beiden Werte vom slider aus einstellen wollen. Könnt ihr mir hier weiterhelfen?

Danke
und
mit freundlichen Grüßen
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wir haben dir doch schon beim letzten mal den Hinweis auf die highgui und deren Tutorials gegeben? Was daran war unpassend? Es ist im uebrigen auch nicht garantiert, das dein Vorgehen hier dauerhaft funktioniert, weil du tkinter und Qt in einer Anwendung mischst. Denn cv.imshow kommt eben aus der highgui, und die ist ueblicherweise mit Qt erstellt. Kann sein, dass es auch GTK gibt/ist, aber es ist garantiert NICHT tk. Und zwei GUIs in einem Programm kann auf Dauer Probleme geben. Wenn es tkinter sein muss (warum auch immer, weiss keiner), dann solltest du auch dessen Mittel zur Darstellung benutzen. Sonst kann es krachen. Siehe zB die Diskussion hier: https://groups.google.com/g/spyderlib/c ... RsMI?pli=1
Interpreter67
User
Beiträge: 14
Registriert: Samstag 24. Oktober 2020, 16:42

Hallo,

Ich habe nun im Internet ein anderes Programm gefunden. Ich weiß nicht ob es highgui ist aber dieser gefällt mir eigentlich ganz gut. Aber als ich es für meine zwecke bearbeitet und umgestellt habe, funktioniert es nicht mehr.

import cv2

def trackChaned(x):
pass

cv2.namedWindow('Color Track Bar')
hh='Max'
hl='Min'
wnd = 'Colorbars'
cv2.createTrackbar("Max", "Color Track Bar",0,255,trackChaned)
cv2.createTrackbar("Min", "Color Track Bar",0,255,trackChaned)
img = cv2.imread('RR.png ')
img = cv2.resize(img, (0,0), fx=0.5, fy=0.5)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
edges = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 15)

while(True):
hul=cv2.getTrackbarPos("Max", "Color Track Bar")
huh=cv2.getTrackbarPos("Min", "Color Track Bar")
ret,thresh1 = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, huh, hul)

cv2.imshow("thresh1",thresh1)

if cv2.waitKey(0)==27:

break

cv2.destroyAllWindows()

Ich wäre sehr dankbar wenn jemand drüber schauen könnte.
Ich wünsche eine gute Nacht
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Also da ist schon eine Menge verquer. Angefangen davon das du kein Code-Tag gesetzt hast, dann sind die Einrueckungen Kraut & Rueben, unbenutzte Variablen, zwei verschiedene Aufrufe von adaptiveThreshold, einer davon falsch, mal ' und mal " fuer Strings benutzt, fehlende Leerzeichen um =, Schreibfehler im Dateinamen, etc. pp.

Hier ein Programm, das halbwegs etwas tut:

Code: Alles auswählen

import cv2
import sys


def on_change(value):
    pass


def main():
    window_name = 'Color Track Bar'
    cv2.namedWindow(window_name)
    cv2.createTrackbar("huh", window_name, 11, 255, on_change)
    cv2.createTrackbar("hul", window_name, 15, 255, on_change)
    img = cv2.imread(sys.argv[1])
    img = cv2.resize(img, (0, 0), fx=0.5, fy=0.5)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    while True:
        hul = cv2.getTrackbarPos("hul", window_name)
        huh = cv2.getTrackbarPos("huh", window_name)
        print(hul, huh)
        thresh1 = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, huh, hul)
        cv2.imshow(window_name, thresh1)

        if cv2.waitKey(1) == 27:
            break


if __name__ == '__main__':
    main()
Wenn man an dem hul-Parameter dreht, schmiert es schnell ab, weil der Parameterbereich ungueltig wird. Ich habe keine Lust gehabt, da jetzt die Doku zu waelzen, wie man das vernuenftig macht. Aber grundsaetzlich funktioniert es so.

Und in Zukunft bitte mehr Sorgfalt walten lassen. Ich bin nicht dein Ausputzer.
Interpreter67
User
Beiträge: 14
Registriert: Samstag 24. Oktober 2020, 16:42

Danke für die hilfe
Antworten