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

Mittwoch 27. April 2011, 21:20

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

Mittwoch 27. April 2011, 21:28

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

Mittwoch 27. April 2011, 21:34

Ä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

Mittwoch 27. April 2011, 21:40

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

Mittwoch 27. April 2011, 21:41

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

Mittwoch 27. April 2011, 21:51

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ß
Antworten