Seltsamer Fehler mit Slider von OpenCV

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
Üpsilon
User
Beiträge: 222
Registriert: Samstag 15. September 2012, 19:23

Hallo mal wieder,
ich möchte mit OpenCV und dessen GUI-Funktionalität ein Programm schreiben, bei dem ich ein Bild mit einem Slider skalieren kann. (Ich hoffe, das ist jetzt im richtigen Unterforum einsortiert.) Dafür hab ich Folgendes geschrieben:

Code: Alles auswählen

import numpy as np
import cv2
from copy import deepcopy

def skalieren(zahl):
    global bild
    bild = cv2.resize(originalbild, ((groesse[0]*zahl)//100, (groesse[1]*zahl)//100))

groesse = (800, 600)
originalbild = cv2.resize(cv2.imread("padborg.jpg"), groesse)
bild = deepcopy(originalbild)

while True:
    cv2.imshow("Hallo", bild)
    cv2.createTrackbar("Skalierung (%)", "Hallo", 100, 200, skalieren)
    if 27 == cv2.waitKey(1): break
Aber wenn ich das laufen lasse und dann auf den Slider klicke, funktioniert das meistens nicht und ich bekomme die Ausgabe
TypeError: 'tuple' object is not callable oder TypeError: 'str' object is not callable. Allerdings ohne Traceback und was sonst noch dazu gehört, das Programm läuft danach auch weiter, aber das Bild ändert sich halt nicht.
Wenn ich den Inhalt der Funktion skalieren durch pass ersetze, tritt das gleiche Problem auf.
Wer kann helfen?
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Üpsilon: Die Fehlermeldungen kann ich nicht nachvollziehen. Aber es tut natürlich auch bei mir nicht das was beabbsichtigt ist. Mindestens mal das `createTrackbar()` gehört nämlich nicht in die Schleife weil das ja ständig neue Schieberegler erzeugt, das darf aber nur *einmal* passieren.

Dann ist das ``global`` falsch. Und der ganze Code auf Modulebene.

Das in der Grösse geänderte Bild muss als Reaktion auf eine Veränderung des Schiebereglers angezeigt werden. Und nur dann. Wobei Du zusätzlich dafür sorgen musst, dass das Bild das engezeigt wird immer gleich gross ist. Also zum Beispiel das skalierte Bild immer in ein leeres Bild einfügen das 200% vom Originalbild ist. Sonst ändert sich nämlich die Fenstergrösse während man den Schieberegler bewegt was zu mehr oder weniger unkontrollierbaren Sprüngen führt, denn durch die Änderung der Fenstergrösse ändert sich die Länge des Schiebereglers und damit die relative Position wo man gerade mit der Maus klickt. Sieht witzig aus, ist aber unbenutzbar.

`np` wird nicht verwendet, und `deepcopy()` sollte man hier auch nicht brauchen.

Die ``if``-Bedingung ist komisch mit der 27 als erster Operand. Das ist etwas was C- und C++-Programmierer manchmal machen um den ``=`` vs. ``==`` zu vermeiden – den es in Python so nicht gibt.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten