(Matlab)如何修改只读光流对象属性

(Matlab) How to modify read only opticalflow object properties

我正在使用 Matlab 分析视频光流,我想做的是权衡视频帧之间的光流。

我的问题是我不知道如何修改 只读 opticalFlow对象 属性,特别是 magnitude 属性.

这是我的测试代码(这个简单的代码在 MathWork 帮助文档 http://uk.mathworks.com/help/vision/ref/opticalflow-class.html 上):

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

检查输出,我们有:

opticalFlow 属性:

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

然后我们检查opflow.Magnitude属性,我们有:

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

当我尝试修改 opticalFlow 对象时(opflow 这里),Matlab报错:

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

然后我检查了 setter 方法并搜索了一些其他文档,但仍然找不到解决方案。我知道我可以将它们复制到另一个矩阵,然后修改那个新矩阵,但是在计算长视频序列的光流时会浪费内存。 有什么方法可以修改这个只读 属性?

Magnitude 是只读的 属性 是有原因的。如果您查看源代码,您会注意到它是一个 Dependent 属性。相应的 getter 方法根据 VxVy 即时计算它。所以直接修改这个 属性 是没有意义的,否则对象会变得不一致。

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

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

此外,所有这些属性,包括 VxVy 都是用 SetAccess='private' 属性声明的,所以即使 VxVy 有 setter 方法,它们不是 public。基本上你不能改变这些属性。

您更改 属性 的唯一方法是创建一个新对象:

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

所以你最终会使用更多的内存,但只是暂时的,直到你的本地矩阵副本超出范围并被垃圾收集器清除。

或者您可以创建自己的 class(复制粘贴)并修改 属性 属性,使它们成为 public.