首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >(Matlab)如何修改只读光流对象属性

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

Stack Overflow用户
提问于 2016-07-11 20:55:37
回答 1查看 1.8K关注 0票数 2

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

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

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

代码语言:javascript
复制
opflow = opticalFlow(randn(5,5),randn(5,5))

检查输出,我们有:

具有属性的opticalFlow:

代码语言:javascript
复制
         Vx: [5x5 double]
         Vy: [5x5 double]
Orientation: [5x5 double]
  Magnitude: [5x5 double]

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

代码语言:javascript
复制
>>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报告了一个错误:

代码语言:javascript
复制
>> opflow.Magnitude(1,1)=0
You cannot set the read-only property 'Magnitude' of opticalFlow.

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-11 21:05:49

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

代码语言:javascript
复制
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方法,它们也不是公共的。基本上,您不能更改这些属性。

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

代码语言:javascript
复制
Vx = opflow.Vx;
Vx(1,1) = 0;
opflow2 = opticalFlow(Vx, opflow.Vy);

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38316080

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档