Seite 1 von 2

Re: Array mit fester Größe erstellen?

Verfasst: Mittwoch 27. April 2011, 21:20
von einfachich
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()

Re: Array mit fester Größe erstellen?

Verfasst: Mittwoch 27. April 2011, 21:28
von 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.

Re: Array mit fester Größe erstellen?

Verfasst: Mittwoch 27. April 2011, 21:34
von einfachich
Ä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.

Re: Array mit fester Größe erstellen?

Verfasst: Mittwoch 27. April 2011, 21:40
von 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.

Re: Array mit fester Größe erstellen?

Verfasst: Mittwoch 27. April 2011, 21:41
von einfachich
oh, das klingt interessant. werds gleich probieren.

Re: Array mit fester Größe erstellen?

Verfasst: Mittwoch 27. April 2011, 21:51
von 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ß

Re: Array mit fester Größe erstellen?

Verfasst: Mittwoch 8. Mai 2019, 18:33
von grafpatron
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.

Re: Array mit fester Größe erstellen?

Verfasst: Mittwoch 8. Mai 2019, 19:18
von __deets__
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.