2013-05-16 2 views
0

У меня есть число изображений, которые должны быть отмечены определенным количеством фиксированных точек. (отслеживание объектов) Я использую impoint, чтобы сделать точки на изображении, а затем построить их для логического подключения друг к другу. Все идет нормально. Затем я нажимаю следующий (на моем графическом интерфейсе MATLAB, разработанном с использованием GUIDE), и новое изображение загружается по оси, и информация теряется (точка).Сохранение графика на изображении, нарисованном с использованием функции impoint

  • Как сохранить нанесенный график impoint для моего следующего изображения?
  • Как я могу убедиться, что при перемещении impoint линии линии также перемещаются?

То, что я до сих пор работать вокруг:

То, что я уже использовал addNewPositionCallback для Updation положения точки. Этот обратный вызов, когда написано: addNewPositionCallback(H, @fnc); он выдает вызов функции что-то вроде fnc(pos)

Моя проблема заключается в том, что этот обратный вызов не обеспечивает ручку.

Следовательно, без информации о ручках я не могу адресовать правый элемент в коде. На данный момент я реализовал это так, что написал 18 однострочных функций для фиксированного числа 18 точек, которые мне нужно отметить на изображении. эти функции вызывают одну и ту же функцию updatestructure(position, 'point_name', handles), которая называется сразу после создания impoints для построения связи между ними на изображении. Но и здесь у меня нет информации о ручках. Вот что я пробовал:

pointname = impoint(gca,[]); 
setcolor(h,'y'); 
position = getPosition(h); 
updatestructure(position, 'pointname', handles); 
addNewPositionCallback(h, @movepointname) 

Так что, когда структура обновления называется сюжетом, отлично работает. Я вижу, чего хочу. Но когда я перемещаю точечную функцию, вызывается movepointname(), и при запуске проблемы.

function movepointname (smart_pos) 
updateStruct (smart_pos, 'pointname'); 
end 

Это, несомненно, сгенерировало ошибку, поскольку информация о ручках не была передана. Я попробовал vargin, чтобы определить, что он должен делать, когда задан меньше аргументов. В этом я все еще нуждаюсь в ручках откуда-то.

спасибо.

ответ

2

Использование ручек при отображении и обновлении изображений и графиков.

Например, при отображении изображения в первый раз (по любым осям):

hImg = image(ImageMatrix); 

обновлять его не выдавать image или imagesc или другую функцию, но обновлять его непосредственно вместо:

set(hImg, 'CData',NewImageMatrix'); 

В этом случае все остальное на ваших осях останется нетронутым.

Вы можете сделать тот же трюк с вашими очками. Первый раз, когда вы построить так:

hPlot = plot(PointsX, PointsY, '*-'); % to plot * connected with line 

Тогда вы

set(hPlot, 'XData',NewPointsX, 'YData',NewPointsY); 

Обратите внимание, что число фактических точек при обновлении сюжета не нужно быть такой же: вы можете первый участок 3 очка и затем обновите дескриптор графика, чтобы показать 33 балла.

Кроме того, в функции инициализации графического интерфейса пользователя вы можете создать пустой участок с

hPlot = plot([], [], '*-'); 

не построить на самом деле ничего, но ручка будет доступна для дальнейших обновлений. То же самое должно работать и с изображениями, но при обновлении изображения с другим количеством строк/столбцов могут возникать проблемы с обновлением лимитов осей. Чтобы решить эту проблему, вы можете обновить изображение, как это:

set(hImg, 'CData',NewImageMatrix', 'XData',1:size(NewImageMatrix,2), 'YData',1:size(NewImageMatrix,1)); 

EDIT: Хорошо, выше будет решить первую проблему. Чтобы обновить свои строки при перемещении impoint, вам необходимо найти ссылку impoint и, в частности, функцию addNewPositionCallback. Затем вам нужно определить функцию обратного вызова, которая обновляет строки (это может быть даже обычный графический дескриптор, такой как hPlot) с новыми координатами.

+0

Что вы для вашего детального ответа. Я не мог добавить дополнительную информацию здесь из-за ограничения персонажа. добавили информацию в вопросе decription, чтобы exaplin проблему более подробно. – Tomar

+0

Я помню, что некоторое время назад я столкнулся с аналогичной проблемой с прямоугольниками 'imrect', потому что они также не раскрывают свои дескрипторы в обратных вызовах. См. Здесь: http://www.mathworks.com/matlabcentral/newsreader/view_thread/282342 надеюсь, что это поможет как-то – anandr

+0

Я предполагаю, что нашел решение. Поставит полное решение подробно, как только оно будет работать. Все еще работаю над этим. назад после короткого отпуска, немного ржавого. – Tomar

0

Вы должны сообщить рисунку, чтобы нарисовать изображение. Для этого используйте функцию HOLD.

hold(AXIS_HANDLE, 'on') 

, где AXIS_HANDLE - это осевая рукоятка. Вам нужно сделать это, прежде чем пытаться нарисовать что-либо еще на рисунке.

Если у вас есть только набор осей вы можете просто позвонить

hold on 

после создания осей.

0

Ответ на вторую часть моего вопроса был найден по ссылке: Mathworks forum. old question

Хитрость передать другие переменные или вызвать функцию в addNewPositionCallback как показано ниже:

addNewPositionCallback(Point_handle,@(p)movepointname(p,'point_Name',handles)); 

Это заявление выше проходит ручки, которые я хотел по первому вопросу, а также позволяет передавать некоторые дополнительные переменные. (p) предназначен для обратного вызова по умолчанию для этой функции, так как movepointname(p); предназначен для текущего положения точки.

Надеюсь, это поможет.

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