2016-07-11 3 views
1

Я использую Matlab для анализа оптического потока видео, и что я хочу сделать, это взвешивание оптического потока между видеокадрами.(Matlab) Как изменить свойства объекта оптического потока только для чтения

Моей проблема, я не знаю, как модифицировать только для чтения оптического потока свойства объекта, особенно, величину свойства.

Вот мой тестовый код (этот простой код на справочной документации 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, у нас есть:

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

Когда я пытаюсь изменить оптический поток объект (opflow здесь), то Matlab сообщение об ошибке:

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

Затем я проверил инкубационных методы и гугле некоторые другие документы но до сих пор не может найти решение. Я знаю, что могу скопировать их в другую матрицу, а затем изменить эту новую матрицу, но она будет тратить память при вычислении оптического потока для длинной видеопоследовательности. Есть ли способ изменить это свойство только для чтения?

ответ

2

Есть причина, по которой Magnitude является доступным только для чтения. Если вы посмотрите на исходный код, вы заметите, что это свойство Dependent. Соответствующий метод геттера рассчитывает его «на лету» от 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 

Кроме того, все эти свойства, в том числе и VxVy объявлены с SetAccess='private' атрибутом, так что даже если Vx и Vy имеют сеттер методы, они не являются общедоступными. В основном вы не можете изменить эти свойства.

Единственный способ для вас, чтобы изменить свойство было бы создать новый объект:

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

Таким образом, вы будете в конечном итоге использовать больше памяти, но только временно, пока ваши локальные копии матрицы не выходят из области видимости и очищаются сборщиком мусора.

В качестве альтернативы вы можете просто создать свой собственный класс (copy-paste) и изменить атрибуты свойств, чтобы сделать их общедоступными.

+0

Спасибо за это объяснение, но он по-прежнему не работает, когда я пытаюсь изменить Vx или Vy напрямую ... 'opflow.Vx (1,1) = 0' все еще не работает .... – drinking

+0

Оказывается, вы не можете установить его вообще, не говоря уже о внесении изменений в один элемент, как в вашем комментарии. См. Обновленный ответ. –

+0

Большое вам спасибо за подробное объяснение! – drinking

Смежные вопросы