【问题标题】:(Matlab) How to modify read only opticalflow object properties(Matlab)如何修改只读光流对象属性
【发布时间】:2016-11-13 22:33:36
【问题描述】:

我正在使用 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

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

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

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

【问题讨论】:

    标签: matlab computer-vision matlab-cvst opticalflow


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的解释,但是当我尝试直接修改Vx或Vy时仍然失败...'opflow.Vx(1,1)=0'仍然无法正常工作....
    • 原来你根本无法设置它,更不用说修改评论中的单个元素了。请查看更新的答案。
    • 非常感谢您的详细解释!
    猜你喜欢
    • 2010-09-21
    • 2019-07-10
    • 2015-09-03
    • 2013-06-21
    • 2019-11-13
    • 2021-05-15
    • 1970-01-01
    • 2020-03-09
    • 1970-01-01
    相关资源
    最近更新 更多