Wand TypeError

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Tholo
User
Beiträge: 177
Registriert: Sonntag 7. Januar 2018, 20:36

@Dead_Eye
Was ist die ungarische Notation?
Edit: WTF das scheint wirklich ein Begriff in der Programmierung zu sein. Schau grad auf Wiki nach.
Gibt es auch die Thüringer Notation?
Benutzeravatar
Felix92
User
Beiträge: 133
Registriert: Mittwoch 7. November 2018, 17:57

@Dead_Eye
vielen Dank ich habe das mal umgesetzt Code läuft.
Notation ist vom Softwarearchitekten leider so vorgegeben.
MfG Felix
Sirius3
User
Beiträge: 18264
Registriert: Sonntag 21. Oktober 2012, 17:20

@Felix92: von welcher Notation redest Du?
Benutzeravatar
Felix92
User
Beiträge: 133
Registriert: Mittwoch 7. November 2018, 17:57

@Sirius3 hat sich erledigt habe gerade gegoogelt ^^ Diese ungarische Notation ist doch nichts anderes als camelCase wenn ich das gerade richtig gesehen habe !??

So zurück zum Thema da hätte ich nämlich gleich noch eine Frage :geek:
In der Methode check_color wird nun der Bereich des Bildes durchlaufen wo das Video dann platziert werden soll.
Das klappt auch ganz gut allerdings frage ich mich ob es nicht möglich wäre mit

Code: Alles auswählen

 box = (left_pixel, upper_pixel, right_pixel, lower_pixel)
einfach den kompletten Bereich zu überprüfen und sich somit die while zu sparen!??
Des weiteren würde ich gerne noch einfügen das der Hintergrund nicht 100% weiß sein muss sondern auch kleine Abweichungen erlaubt sind dazu ist mir allerdings leider noch keine "gute" Idee gekommen :roll:
kurz noch zur Erklärung: left_pixel und upper_pixel bilden im Koordinatensystem die (x,y)-Werte der obere linke Ecke des Videobereichs right_pixel und lower_pixel die untere rechte Ecke.

Code: Alles auswählen

def convert(self, file_path, filename, new_project_path, new_project_name):
        folder = Path(new_project_path, new_project_name)
        folder.mkdir(exist_ok=True) 
        input_file = Path(file_path, filename)
        pages = convert_from_path(str(input_file), 250)
        files = []
        for page_number, page in enumerate(pages, start=1):
            target = folder / f"{page_number:03d}.jpg"
            page.save(str(target),  'JPEG')
            
        for file in os.listdir(folder):
            files.append(file)

        files.sort()

    def check_color(self, file_path, filename, left_pixel, upper_pixel, right_pixel, lower_pixel):
        input_file = Path(file_path, filename)
        img = Image.open(input_file)
        width, height = img.size  #1260x945
        #box = (left_pixel, upper_pixel, right_pixel, lower_pixel)
        imgload = img.load()
        x = left_pixel
        y = upper_pixel
        window_width = right_pixel - left_pixel   
        
        while True:
            point = imgload[x, y]
            if point == (255, 255, 255):
                x += 1
                if x == width:
                    x -= window_width
                    y += 1
                elif x == right_pixel and y == lower_pixel:  
                        return True
            else:
                return False
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du wirst nicht darum herumkommen, dir die Pixel anzuschauen. Aber natuerlich kannst du das mit anderen Methoden wie eben zb der OpenCV machen. Da gibt es dann Operationen, die auf dem gesamten Bildausschnitt arbeiten, und dir zB ein Histogramm der Grauwerte liefern, das du auswerten kannst. Oder Kontouren ermittelt, die du zaehlen kannst. Und mit oder ohne adaptive Thresholding vorher. Etc. Das ist dann halt computer vision. Wenn du da Fortschritte erzielen willst, ist es hilfreich dir eine Sammlung von positiv und negativ Beispielen zu erstellen, und deine Bewertungsfunktion einfach darauf anzuwenden, um zu sehen, ob sie die Beispiele richtig klassifiziert.
Benutzeravatar
__blackjack__
User
Beiträge: 14028
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Felix92: Ungarische Notation hat nichts mit CamelCase zu tun, das geht auch nur mit Kleinbuchstaben und Unterstrichen.

Eine ``while``-Schleife falsch, auch wenn man sich die Pixel tatsächlich in Python-Code einzeln anschaut. Das ist ein Fall für ``for``-Schleifen.

Man könnte sich das Bild in ein Numpy-Array umwandeln, dann kann man sich Schleifen in Python sparen. Vorher vielleicht in ein Graustufenbild umwandeln, und hinterher 255 von dem Array abziehen und schauen ob absolute Werte über einer bestimmten Grenze übrig bleiben.

Und die ”Methoden” sind auch wieder/immer noch keine Methoden sondern einfach nur Funktionen die nichts in einer Klasse verloren haben. In der Klasse sollte man da mindestens mal `staticmethod()` verwenden, damit das klarer ist, das die überhaupt nicht vom Objekt abhängen.

Warum ist das denn in einer Klasse definiert? Du erwähntest ja einen Softwarearchitekten – nicht das der das alles in eine ”Klasse” gesteckt hat, weil der *alles* in Klassen steckt, weil er von Sprachen kommt oder Werkzeuge/Notationen verwendet, bei denen es keine Funktionen gibt und man gezwungen ist alles in eine Klasse zu stecken.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Benutzeravatar
DeaD_EyE
User
Beiträge: 1231
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Die ungarische Notation ergibt nur bei statisch typisierten Sprachen Sinn.
Mit der Notation gibt man am Anfang der Variable an, um welchen Datentyp es sich handelt.

Python ist eine dynamische Sprache und da kann ein Name auf alle möglichen Objekte verweisen und sich zur Laufzeit ändern.
Würde man auch in Python diese Art der Notation verwenden, verleitet das den Programmierer zu falschen Annahmen.

@ontopic
Wenn du irgendeinen Container oder Sequenz hast (list, tuple, dict...) und wiederholt irgendwas mit den Daten machen musst, ist eine for-schleife die richtige Wahl.
Wenn du selbst alles zu Fuß machst, kannst auch gleich auf C umsteigen. Dort muss man alles zu Fuß machen. Nutze lieber die Konzepte, die über 20 Jahre lang gereift sind.
Iteration ist eins der wichtigsten Konzepte in Python.

Numpy wäre hier auf jeden Fall die bessere Wahl, weil diese Bibliothek auch die Slice-Notation für mehrdimensionale Arrays ermöglicht (und noch viel mehr).
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Benutzeravatar
__blackjack__
User
Beiträge: 14028
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@DeaD_EyE: Das stimmt nicht so ganz, denn ungarische Notation ist eigentlich das man den ”duck type” als Präfix in den Namen schreibt. Das Microsoft und ein paar andere das einfach auf die konkreten Typen und ohne nachzudenken auf alle Namen angewendet haben, war so ja gar nicht gedacht. Und das macht gerade bei statisch typisierten Sprachen am wenigsten Sinn und kommt auch eher aus der Ecke der nicht strikt, dynamisch typsierten Sprachen. Also da wo der Benutzer selbst dafür verantwortlich ist immer den Typ zu kennen, weil der nirgends sonst kodiert ist. Also weder statisch einem Namen zugeordnet ist, noch dynamisch einem Wert.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Benutzeravatar
Felix92
User
Beiträge: 133
Registriert: Mittwoch 7. November 2018, 17:57

Vielen Dank erstmal an alle ich werde mir das die Tage mal anschauen :)
@__blackjack__ hier mal die Anforderungen für die Folienverarbeitung und die Erkennung des Sprechers:
ich habe es gerade selbst gesehen das es ein Modul und keine Klasse sein soll werde ich morgen noch anpassen ^^
Die Ausgabe wurde nach Absprache geändert also das mit dem Projektordner ist korrekt.

Bild

Bild

MfG Felix
Benutzeravatar
Felix92
User
Beiträge: 133
Registriert: Mittwoch 7. November 2018, 17:57

Da bin ich wieder :D
Und zwar wollte ich mal nachfragen, wie ich aus dieser regionOfInterest (roi) nun quasi prüfen kann ob jeder Pixel weiß ist oder noch besser die einzelnen Pixel einen ähnlichen Farbwert besitzen, falls es leichte Abweichungen geben sollte .
Und wäre es möglich wie hier white eine Variable mit einem Farbwert zu initialisieren ?
Weil ich habe so die leichte Vermutung dass das Blödsinn ist :lol:

Code: Alles auswählen

def test(file, y1, y2, x1, x2):

    img = cv2.imread(file, cv2.IMREAD_GRAYSCALE)
    white = (255, 255)  
    print(img.shape) 
    roi = img[y1:y2, x1:x2]
  
    print(np.all(video_place is white))
    cv2.imshow('image', roi)
    cv2.waitKey()
    cv2.destroyAllWindows
MfG Felix
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Hast du mal in die aeusserst umfangreiche OpenCV-Dokumentation geschaut? Was da so an Beispielen zu den von mir genannten Stichworten zB steht?
Benutzeravatar
Felix92
User
Beiträge: 133
Registriert: Mittwoch 7. November 2018, 17:57

Naja ich hatte mir in der docu die Tutorials angesehen dann noch probiert über google etwas zu finden ohne großen Erfolg und die docu an sich allerdings bin ich da nicht so schlau draus geworden, da diese wie du schon sagtest ziemlich umfangreich ist.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich habe dir ja eine Reihe von konkreten Ansaetzen genannt, zB Histogramme. Letztlich musst du entscheiden, welche Kriterien fuer "hier ist nichts was wichtig ist" du hast. Das kann hier keiner fuer dich tun, denn es ist dein Projekt, deine Slides, deine Kriterien.

Und wenn du *ein* Kriterium hast (zb einfach alles komplett weiss), das fuer einen gegebenen Ausschnitt funktioniert, dann kannst du das ja in Zukunft erweitern. Oder deinen Prof fragen, wie das Kriterium genauer aussehen soll.
Benutzeravatar
Felix92
User
Beiträge: 133
Registriert: Mittwoch 7. November 2018, 17:57

Huhu und zwar wollte ich mal nachfragen, wie ich es hinbekomme dass in einem Bild ein Video als Overlay liegt, welches relativ zum Video abspielt.
Kurz zum Problem: ich habe eine PDF in Bilder gesplittet diese Bilder werden dann geprüft ob auf ihnen unten rechts (250x200) alles weiß ist um dort ein Bild einzufügen (soweit läuft alles) nun soll es aber auch möglich sein in diesem unteren Bereich anstatt einem Bild ein Video einzublenden.
Also kurz im unteren Beispiel sollte jetzt nur die Folie zu sehen sein und das aktuelle Video auf der Folie unten rechts wenn Platz ist ansonsten wenn kein Platz ist wird nur die Folie angezeigt.
Ich hoffe es ist einigermaßen verständlich :roll:

Bild


Das steht bisher (hat bisher mehr zum testen und probieren gedient):
check_color liefert True wenn Platz auf der Folie ist.

Code: Alles auswählen

def video_in_slide(file_path, filename, video_path, videoname, y1, y2, x1, x2):
    presentation_file = Path(file_path, filename)
    video_file = Path(video_path, videoname)
    if check_color(file_path, filename, y1, y2, x1, x2) == True:
        cap = cv2.VideoCapture(str(video_file))
        if(cap.isOpened() == False):
            print("Error opening video stream or file")
        while(cap.isOpened()):
            ret, frame = cap.read()
            if ret == True:
                cv2.imshow('Frame', frame)
                if cv2.waitKey(25) & 0xFF == ord('q'):
                    break
            else:
                break
        cap.release()
        cv2.destroyAllWindows()
    else:
        img = cv2.imread(str(presentation_file), cv2.IMREAD_COLOR)
        return img
MfG Felix
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Brauchst du keinen Ton dafuer? Woher weisst du denn, wann welche Slide dran ist?

Ansonsten ist das ganz einfach: den Frame kannst du mit imresize auf das gewuenschte Mass stutzen, und in das Image des PDFs das du ja schon als numpy-Array vorliegen hast reinpacken.

slide[y:y+hoehe,x:x+breite] = frame
Benutzeravatar
Felix92
User
Beiträge: 133
Registriert: Mittwoch 7. November 2018, 17:57

Huhu @__deets__ also Ton geht mich nichts an da kümmern sich andere drum ein Problem weniger ^^ :)
2teres ist eins der Probleme wo ich nicht so recht weiß wie ich es lösen soll ..ich hatte halt im Kopf die Bilder zu einem Video zusammenzufügen und das Video des Dozenten als Overlay an die Position zu legen wenn die Folie unten rechts Platz für hat...allerdings funktioniert dafür meine Funktion check_color vermutlich nicht wenn die Bilder dann ein Video sind !? :?:

Ich poste hier einfach mal den kompletten Code um ein wenig klarer zu machen was bisher passiert :)
check_color und video_in_slide wären hier ausschlaggebend

Code: Alles auswählen

def convert(file_path, filename, new_project_path, new_project_name):

    pdf_file = Path(file_path, filename)
    check_pdf = fnmatch(pdf_file, '*.pdf')
    if check_pdf == True:
        folder = Path(new_project_path, new_project_name)
        folder.mkdir(exist_ok=True) 
        input_file = Path(file_path, filename)
        pages = convert_from_path(str(input_file), 250)
        files = []
        for page_number, page in enumerate(pages, start=1):
            target = folder / f"{page_number:03d}.jpg"
            page.save(str(target),  'JPEG')
        for file in os.listdir(folder):
            files.append(file)

        files.sort()
    else:
        print("the datatype must be .pdf")


def add_file_to_project(file_path, filename, project_path, project_name):

    folder = Path(project_path, project_name)
    file_to_add = Path(file_path, filename)
    check_jpg = fnmatch(file_to_add, '*.jpg')
    check_mp4 = fnmatch(file_to_add, '*.mp4')
    check_png = fnmatch(file_to_add, '*.png')
    if check_jpg == True:
        shutil.copy(str(file_to_add), str(folder))
    elif check_mp4 == True:
        shutil.copy(str(file_to_add), str(folder))
    elif check_png == True:
        shutil.copy(str(file_to_add), str(folder))
    else:
        print("the datatype must be .jpg or .mp4 or .png")


def delete_folder(project_path, project_name):

    folder = Path(project_path, project_name)
    shutil.rmtree(folder, ignore_errors=True)


def check_color(file_path, filename, y1, y2, x1, x2):

    input_file = Path(file_path, filename)
    white = 255
    gray = 32
    img = cv2.imread(str(input_file), cv2.IMREAD_GRAYSCALE)
    roi = img[y1:y2, x1:x2]

    if np.all(roi == white) == True:
        return True
    elif np.all(roi == gray) == True:
        return True
    else:
        return False
    

def picture_in_presentation(file_path, filename, file_path_small_img, small_img, y1, y2, x1, x2, x_offset, y_offset):

    large_img = Path(file_path, filename)
    large_img = cv2.imread(str(large_img))

    small_img = Path(file_path_small_img, small_img)
    small_img = cv2.imread(str(small_img))
    small_img = cv2.resize(small_img, (250, 200))

    #x_offset = 1009 #only for resolution 250 # large_img width - 250
    #y_offset = 710 #only for resolution 250 # large_img height - 245

    if check_color(file_path, filename, y1, y2, x1, x2) == True:
        large_img[y_offset:y_offset+small_img.shape[0], x_offset:x_offset+small_img.shape[1]] = small_img
        #cv2.imwrite('test.jpg', large_img)
        return large_img
    else:
        #cv2.imwrite('test.jpg', large_img)
        return large_img


def video_in_slide(file_path, filename, video_path, videoname, y1, y2, x1, x2):
    presentation_file = Path(file_path, filename)
    video_file = Path(video_path, videoname)
    if check_color(file_path, filename, y1, y2, x1, x2) == True:
        cap = cv2.VideoCapture(str(video_file))
        if(cap.isOpened() == False):
            print("Error opening video stream or file")
        while(cap.isOpened()):
            ret, frame = cap.read()
            if ret == True:
                cv2.imshow('Frame', frame)
                if cv2.waitKey(25) & 0xFF == ord('q'):
                    break
            else:
                break
        cap.release()
        cv2.destroyAllWindows()
    else:
        img = cv2.imread(str(presentation_file), cv2.IMREAD_COLOR)
        return img
MfG Felix
und vielen Dank für eure Hilfe
Sirius3
User
Beiträge: 18264
Registriert: Sonntag 21. Oktober 2012, 17:20

man prüft nicht explizit auf == True. Die ganzen check_-Variablen sind auch nicht nötig, und statt dreimal den selben if-Block würde man auch die drei Bedingungen mit and verknüpfen. Bei `Path` gibt es dann auch noch suffix:

Code: Alles auswählen

def add_file_to_project(file_path, filename, project_path, project_name):
    file_to_add = Path(file_path, filename)
    if file_to_add.suffix in ['.jpg', '.mp4', '.png']:
        folder = Path(project_path, project_name)
        shutil.copy(str(file_to_add), str(folder))
    else:
        print("the datatype must be .jpg or .mp4 or .png")
Benutzeravatar
Felix92
User
Beiträge: 133
Registriert: Mittwoch 7. November 2018, 17:57

Danke für den Tipp werde ich morgen umsetzen :)
Allerdings hilft mir das bei dem eigentlichen Problem nicht wirklich weiter hast du da vlt. eine Idee ? :D
MfG Felix
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Kann es sein, das diese ganze pdf Geschichte unnötig ist? Du willst eigentlich dir Projektion des Vortrages zugrunde legen?
Benutzeravatar
Felix92
User
Beiträge: 133
Registriert: Mittwoch 7. November 2018, 17:57

Naja nicht so ganz es soll halt möglich sein diese pdf Datei (Folien) quasi auszulesen wenn Platz ist soll es möglich sein selbstständig ein Bild einzufügen oder das halt das Video unten rechts eingeblendet wird, da das Video so wie in dem Bild nicht mehr da sein wird am Ende ...das ganze ist am Ende ein Schnittprogramm wo 2 Master und 8 Bachelor dran arbeiten und meine Task ist halt derzeit "nur" ein module für das wie oben beschrieben zu schreiben ..Ich hatte weiter oben auch mal die beiden Tasks gepostet wobei das Objekt gestrichen wurde und durch diesen temporären Ordner ersetzt wird.
MfG Felix
Antworten