(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 方法根据 Vx
和 Vy
即时计算它。所以直接修改这个 属性 是没有意义的,否则对象会变得不一致。
function out = get.Magnitude(this)
out = computeMagnitude(this.pVx, this.pVy);
end
function mag = computeMagnitude(Vx, Vy)
mag = sqrt(Vx.*Vx + Vy.*Vy);
end
此外,所有这些属性,包括 Vx
和 Vy
都是用 SetAccess='private'
属性声明的,所以即使 Vx
和 Vy
有 setter 方法,它们不是 public。基本上你不能改变这些属性。
您更改 属性 的唯一方法是创建一个新对象:
Vx = opflow.Vx;
Vx(1,1) = 0;
opflow2 = opticalFlow(Vx, opflow.Vy);
所以你最终会使用更多的内存,但只是暂时的,直到你的本地矩阵副本超出范围并被垃圾收集器清除。
或者您可以创建自己的 class(复制粘贴)并修改 属性 属性,使它们成为 public.
我正在使用 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 方法根据 Vx
和 Vy
即时计算它。所以直接修改这个 属性 是没有意义的,否则对象会变得不一致。
function out = get.Magnitude(this)
out = computeMagnitude(this.pVx, this.pVy);
end
function mag = computeMagnitude(Vx, Vy)
mag = sqrt(Vx.*Vx + Vy.*Vy);
end
此外,所有这些属性,包括 Vx
和 Vy
都是用 SetAccess='private'
属性声明的,所以即使 Vx
和 Vy
有 setter 方法,它们不是 public。基本上你不能改变这些属性。
您更改 属性 的唯一方法是创建一个新对象:
Vx = opflow.Vx;
Vx(1,1) = 0;
opflow2 = opticalFlow(Vx, opflow.Vy);
所以你最终会使用更多的内存,但只是暂时的,直到你的本地矩阵副本超出范围并被垃圾收集器清除。
或者您可以创建自己的 class(复制粘贴)并修改 属性 属性,使它们成为 public.