计算机视觉 - (Matlab) 如何修改只读光流对象属性



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

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

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

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

检查输出,我们有:

具有特性的光流:

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

然后我们检查操作流。量级属性,我们有:

>>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 方法,它们也不是公共的。基本上,您无法更改这些属性。

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

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

因此,您最终将使用更多内存,但只是暂时的,直到您的本地矩阵副本超出范围并被垃圾回收器清除。

或者,您可以只创建自己的类(复制粘贴)并修改属性属性以使其公开。

最新更新