2016-07-11 12 views
1

Ich verwende Matlab, um den optischen Videofluss zu analysieren, und was ich tun möchte, ist den optischen Fluss zwischen Videobildern zu wiegen.(Matlab) Wie ändere ich schreibgeschützt opticalflow Objekteigenschaften

Mein Problem ist, ich weiß nicht, wie die nurOptischer Fluss Objekt-Eigenschaft lesen zu ändern, speziell, Größe Eigenschaft.

Hier mein Testcode ist (diese einfache Code ist auf der MathWork Hilfe-Dokumentation http://uk.mathworks.com/help/vision/ref/opticalflow-class.html):

opflow = opticalFlow(randn(5,5),randn(5,5)) 

überprüfen Sie die Ausgabe, die wir haben:

Optischer Fluss mit den Eigenschaften:

  Vx: [5x5 double] 
     Vy: [5x5 double] 
Orientation: [5x5 double] 
    Magnitude: [5x5 double] 

Dann überprüfen wir die Eigenschaft opflow.Magnitude, wir haben:

>>opflow.Magnitude 

ans = 

1.1661 1.5809 1.9726 0.2291 0.6722 
1.9727 1.2263 3.0523 0.2715 1.2187 
2.2791 1.1224 1.0470 1.5235 0.9531 
0.9109 3.6688 1.3717 1.4433 1.9629 
0.8494 4.0421 1.8548 1.6603 1.2122 

Wenn ich versuche, die Optischer Fluss Objekt (opflow hier) zu modifizieren, berichten die Matlab einen Fehler:

>> opflow.Magnitude(1,1)=0 
You cannot set the read-only property 'Magnitude' of opticalFlow. 

ich dann Setter Methoden geprüft und googeln einige andere Dokumente kann aber immer noch keine Lösung finden. Ich weiß, dass ich sie in eine andere Matrix kopieren und dann diese neue Matrix modifizieren könnte, aber es wird Speicher verschwenden, während der optische Fluss für eine lange Videosequenz berechnet wird. Gibt es eine Möglichkeit, diese schreibgeschützte Eigenschaft zu ändern?

Antwort

2

Es gibt einen Grund Magnitude ist eine schreibgeschützte Eigenschaft. Wenn Sie sich den Quellcode anschauen, werden Sie feststellen, dass es sich um eine Dependent Eigenschaft handelt. Entsprechende Getter-Methode berechnet es im laufenden Betrieb von Vx und Vy. Es macht also keinen Sinn, diese Eigenschaft direkt zu ändern, da sonst das Objekt inkonsistent wird.

function out = get.Magnitude(this) 
    out = computeMagnitude(this.pVx, this.pVy); 
end 

function mag = computeMagnitude(Vx, Vy) 
    mag = sqrt(Vx.*Vx + Vy.*Vy); 
end 

Darüber hinaus sind alle diese Eigenschaften, einschließlich Vx und Vy mit SetAccess='private' Attribut deklariert werden, so dass, obwohl Vx und Vy haben Setter-Methoden, sie sind nicht öffentlich. Grundsätzlich können Sie diese Eigenschaften nicht ändern.

Die einzige Möglichkeit für Sie, die Eigenschaft zu ändern, um ein neues Objekt zu erstellen wäre:

Vx = opflow.Vx; 
Vx(1,1) = 0; 
opflow2 = opticalFlow(Vx, opflow.Vy); 

So werden Sie mit mehr Speicher, aber nur vorübergehend am Ende, bis die lokale Matrix Kopien außerhalb des Gültigkeitsbereichs gehen und werden vom Müllsammler gelöscht.

Alternativ können Sie auch Ihre eigene Klasse erstellen (kopieren und einfügen) und Eigenschaftenattribute ändern, um sie öffentlich zu machen.

+0

Danke für diese Erklärung, aber es ist immer noch fehlgeschlagen, wenn ich versuche, Vx oder Vy direkt zu ändern ... 'opflow.Vx (1,1) = 0' funktioniert immer noch nicht .... – drinking

+0

Es stellt sich heraus, dass Sie es überhaupt nicht einstellen können, ganz zu schweigen von der Änderung eines einzelnen Elements wie in Ihrem Kommentar. Bitte sehen Sie die aktualisierte Antwort. –

+0

Vielen Dank für diese detaillierte Erklärung! – drinking