Array mit fester Größe erstellen?

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.
einfachich
User
Beiträge: 13
Registriert: Mittwoch 27. April 2011, 17:55

Bitte hilf mir noch Mal.
Folgendes Skript erhält 2 sw-Bilder:

Code: Alles auswählen

import sys, cv, math, numpy

if __name__ == "__main__":
    if len(sys.argv) != 3:
        print "left, right Quellen fehlen"
        sys.exit(0)

    b1 = cv.LoadImage(sys.argv[1])
    b2 = cv.LoadImage(sys.argv[2])
    a = cv.CreateMat(b1.height, b1.width, cv.CV_64FC1)
    cv.Sub(b1,b2,a)
Was mache ich falsch?

Code: Alles auswählen

E:\>python test2.py left.png right.png

OpenCV Error: Assertion failed (src1.size == dst.size && src1.type() == dst.type()) in unknown function, file ..\..\..\..\ocv\opencv\modules\core\src\arithm.cpp, line 1788
Traceback (most recent call last):
  File "test2.py", line 18, in <module>
    cv.Sub(b1,b2,a)
cv.error: src1.size == dst.size && src1.type() == dst.type()
Zuletzt geändert von einfachich am Mittwoch 27. April 2011, 21:37, insgesamt 3-mal geändert.
deets

Eine Woche Vollzeit? Das sollte sich doch in 2-3h maximal runterprogrammieren lassen. Wie dem auch sei, nichts von dem hat ja gross was mit Python zu tun. Sondern der OpenCV. Dafuer gibt's ein Buch, das ist ganz gut. Und ich denke euer Lehrer/Ausbilder/Prof hat euch da auch noch was an die Hand gegeben.
einfachich
User
Beiträge: 13
Registriert: Mittwoch 27. April 2011, 17:55

Ähm, nein. Außer ein paar Qullen im Netz und ein Skript mit ein paar Beispielen, die nicht mit der Aufgabe zu tun haben, hat uns unser Prof nicht gegeben. Das Buch openCV habe ich mir bestellt.

Das Problem sind die ständigen Fehlermeldungen und ich finde keine Doku, wie die zu verstehen sind. Siehe oben.

PS. Beide bilder sind gleich groß und vom gleichen Typ.
Zuletzt geändert von einfachich am Mittwoch 27. April 2011, 21:40, insgesamt 1-mal geändert.
deets

Naja, die Fehlermeldung ist doch recht eindeutig. Du hast entweder eine falsche Dimension, oder einen falschen Datentypen. Wenn deine Bilder gleichgross sind (was ich jetzt mal annehme), dann ist es zweiteres. Und das ist doch auch klar. Du machst ja nicht, was ich dir gesagt habe: du musst *erst* die Matrix konvertieren, also deine Bilder in den Zahlenraum CV_64FC1 ueberfuehren, mit ConvertScale. *Dann* kannst du die subtrahieren.
einfachich
User
Beiträge: 13
Registriert: Mittwoch 27. April 2011, 17:55

oh, das klingt interessant. werds gleich probieren.
problembär

Nochmal zur Ausgangsfrage:
einfachich hat geschrieben:in Sprachen wie Java und C muss man beim Anlegen eines Array die Größe festlegen,also die Anzahl der zu speichernden Elemente.

Ich weiß, dass man in Python ein Array anlegt mit:
a = []

Elemente fügt man hinzu mit:
a.append(45)
a.append(345)
a.append(12)
usw...

Das geht zwar recht bequem aber die Laufzeit lässt zu wünschen übrig ...

Deshalb möchte ich von Beginn an die Größe fest vorgeben und über die Indizes auf die einzelnen Elemente zugreifen.
Erstmal: In Python ist die Philosophie eine andere: Es gibt veränderliche Listen

Code: Alles auswählen

a = [1, 2, 3]
(sehr bequem) und dann gibt es noch unveränderliche Tuples

Code: Alles auswählen

a = (1, 2, 3)
damit es, wenn man von vornherein weiß, daß es unveränderlich sein wird (z.B. bei konstanten Daten) schneller laufen kann.
Aber eigentlich ist Ziel des Datentyps "Liste", daß der Programmierer es möglichst leicht hat. Die geringere Laufzeitgeschwindigkeit des Programms wird dabei bewußt in Kauf genommen. Dafür ist der Programmierer schneller.

Das, was Du machen willst, kannst Du entweder über eine voll initialisierte Liste erreichen (s.o. den Beitrag von numerix) oder Du schreibst ein Python-Modul in C, das Du kompilieren und in Python einbinden kannst (sog. Extension). Man kann also Python und C mischen, wenn man denn will. Dabei schreibst Du also C-Code, der von Python aus angesteuert werden kann. Dann hast Du Dein C wieder. Mit all den Schwierigkeiten, die das mit sich bringt.

Gruß
grafpatron
User
Beiträge: 1
Registriert: Mittwoch 8. Mai 2019, 18:31

arr = [None] * Größe

-> dabei ist "None" ein fester Begriff, der sozusagen ein Array mit einem Element erstellt, welches aber undefiniert ist, wie eine undefinierte Variable bei Java: int variable;

Mit der Größe multipliziert ergibt sich dann ein Array mit einer festen Größe, wobei jedes Element noch nicht definiert ist.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Also eigentlich ist die Frage ja seit 8 Jahren beantwortet...

Und leider weist deine Antwort auch ein paar Lücken auf. Zum einen ist None keine ein-elementige Liste. Sondern eine Konstante wie null in Java. [None] ist die einelementige Liste, die None enthält. Und dann ist

int etwas;

genau KEINE uninitialiserte Variable. Sondern 0. Wenn wäre

Integer etwas;

das Äquivalent - das ist null, weil uninitialisiert.
Antworten