我使用Matlab来分析视频光流,我想做的是权衡视频帧之间的光流。
我的问题是,我不知道如何修改只读 opticalFlow对象属性,特别是属性。
下面是我的测试代码(这个简单的代码在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当我试图在这里修改object(opflow opticalFlow时,Matlab报告了一个错误:
>> opflow.Magnitude(1,1)=0
You cannot set the read-only property 'Magnitude' of opticalFlow.然后,我检查了setter方法,并搜索了一些其他文档,但仍然找不到解决方案。我知道我可以把它们复制到另一个矩阵中,然后修改新的矩阵,但是当计算一个长视频序列的光流时,它会浪费内存。,我可以修改这个只读属性吗?
发布于 2016-07-11 21:05:49
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方法,它们也不是公共的。基本上,您不能更改这些属性。
更改属性的唯一方法是创建一个新对象:
Vx = opflow.Vx;
Vx(1,1) = 0;
opflow2 = opticalFlow(Vx, opflow.Vy);因此,您将最终使用更多的内存,但只能暂时使用,直到本地矩阵副本超出范围并被垃圾收集器清除为止。
或者,您可以创建自己的类(复制粘贴)并修改属性属性,使其公开。
https://stackoverflow.com/questions/38316080
复制相似问题