Seite 1 von 1

Schleife beenden

Verfasst: Dienstag 24. September 2019, 17:09
von F_Wink
Hallo zusammen,
meine Frage ist vermutlich eine Lapalie aber ich stehe etwas auf dem Schlauch. Ansich funktioniert mein Code so wie gewünscht. Meine Formel wird berechnet, anschließend die Variablen wie angegeben erhöht, erneut berechnet usw. und alle Ergebnisse werden mir in der Kommandozeile untereinander ausgegeben. Zwar beendet das Programm die Ausgabe korrekt durch den break aber in der Kommandozeile sieht es so aus als ob das Skript noch läuft. Befehle sind erst nach manuellem stoppen wieder möglich. Habe ich irgendwo etwas übersehen wieso die Schleife unendlich ohne Ausgabe weiterläuft?
Dankeschön!

#Berechnung der Abstände


a = 0
b = 1
A = T.index[a,]
I = T.index[-1,]

while True:

for i in range(b, int(I+1)):
H = (math.sqrt(((T['X-Werte'][A])-(T['X-Werte']))**(2)+((T['Y-Werte'][A])-(T['Y-Werte']))**(2)))
H = ("%.3f" % H)
print (H)

if a != T.index[-1,]:
A += 1
b += 1
else:
break

Re: Schleife beenden

Verfasst: Dienstag 24. September 2019, 17:11
von F_Wink
Leider sieht man die Einzüge aus meinem Skript nicht....

Re: Schleife beenden

Verfasst: Dienstag 24. September 2019, 17:56
von sparrow
Setz den Code in Code-Tags (erscheinen wenn man im vollständigen Editor den </> Knopf drückt. Dann bleiben die Einrückungen erhalten.

Re: Schleife beenden

Verfasst: Dienstag 24. September 2019, 18:39
von F_Wink

Code: Alles auswählen

#Berechnung der Abstände
    

a = 0
b = 1
A = T.index[a,]
I = T.index[-1,]
H=0

while True:

    for i in range(b, int(I+1)):
        H = (math.sqrt(((T['X-Werte'][A])-(T['X-Werte'][i]))**(2)+((T['Y-Werte'][A])-(T['Y-Werte'][i]))**(2)))
        H = ("%.3f" % H)
        print (H)

    if a != T.index[-1,]:
        A += 1
        b += 1
    else:
        break

Re: Schleife beenden

Verfasst: Dienstag 24. September 2019, 18:51
von nezzcarth
Zeig uns doch bitte das vollständige oder zumindest ein funktionierendes Skript. Hier fehlt zum Beispiel 'T'. Abgesehen davon ist der Code in der Form schwer lesbar. Variablen werden in Python per Konvention klein geschrieben (Großbuchstaben sind Konstanten vorbehalten) und sollten nach Möglichkeit auch sprechende Namen haben. Dass es etwa Klein- und Groß-A gibt, ist besonders verwirrend. Selbst wenn diese Variablenbenennung bei mathematischen Formeln so gängig ist, würde ich davon möglichst abraten.

Ich frage mich auch, welchen Datentyp 'T' hat und wundere mich, falls die ganzen Indexzugriffe und Methodenaufrufe wirklich so funktionieren. 'T.index[-1,]' sieht zum Beispiel schon sehr seltsam aus.

Re: Schleife beenden

Verfasst: Dienstag 24. September 2019, 19:04
von F_Wink
Hier dann mal der ganze Code, T ist ein Dataframe. Als Bild braucht man ein Bild auf dem Kreise erkannt werden sollen/können.
Habe teilweise ein # vor befehle gemacht. Nur damit ich sie "zuschalten" kann wenn benötigt.

Code: Alles auswählen

import cv2
import numpy as np
import pandas as pd
import math
from statistics import mean

# Bild einlesen und Bearbeiten
img = cv2.imread('Test2kopie.jpg',0)
img = cv2.medianBlur(img,5)
cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)

# Kreise erkennen
circles = cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1,20,
                           param1=20,param2=30,minRadius=0,maxRadius=100)

circles = np.uint16(np.around(circles))
for i in circles[0,:]:
    
# Kreisumfang zeichnen
    cv2.circle(cimg,(i[0],i[1]),i[2],(0,255,0),2)
# Kreiszentrum zeichnen
    cv2.circle(cimg,(i[0],i[1]),2,(0,0,255) ,3)
    
#Detektierte Kreise anzeigen
#cv2.imshow('detected circles',cimg)
cv2.waitKey(0)
cv2.destroyAllWindows()

#Wertetabelle anzeigen
if circles is not None:
    circles = np.round(circles[0, :]).astype("int")  
    #umrechnung von Pixel in µm^2
    X = (circles*0.1075) #für quadirerung der tabelle**(2)
    T = pd.DataFrame(X)
    #Zeilen beschriften
    T.columns = ['X-Werte', 'Y-Werte', 'Radius']
    T['X-Werte'] = T['X-Werte'] - T['Radius']
    T['Y-Werte'] = T['Y-Werte'] - T['Radius']

#print (T)

#Berechnung der Abstände
    

a = 0
b = 1
A = T.index[a,]
I = T.index[-1,]
H=0

while True:

    for i in range(b, int(I+1)):
        H = (math.sqrt(((T['X-Werte'][A])-(T['X-Werte'][i]))**(2)+((T['Y-Werte'][A])-(T['Y-Werte'][i]))**(2)))
        H = ("%.3f" % H)
        print (H)

    if a != T.index[-1,]:
        A += 1
        b += 1
    else:
        break

Re: Schleife beenden

Verfasst: Dienstag 24. September 2019, 22:05
von snafu
Du da innerhalb der letzten Schleife weder a noch T veränderst, bleibt das Ergebnis halt immer wahr und die Schleife kommt nie zum break.