最近在基本零基础搞深度学习的项目,第一个工作就是收集数据集。大致的工作是圈出几百张图片中的汽车,并给出它们的坐标,作为训练集。本来就是一个苦力活,再不借助工具,简直要忙死。在网上搜了一下,发现没有什么现成的可以在一张图里同时动态地辅助圈出多个区域的工具,决定自己做一个。
思路简单来说就是,通过句柄来画图。
function draw()
clear;
clc;
im = imread('E:\壁纸\gamersky_032origin_063_20151171713B6F.jpg');
imshow(im);
hold on;
global isClick;
isClick = false;
set(gcf, 'WindowButtonDownFcn', @MouseClickFcn); % 鼠标按下时,执行MouseClickFcn
set(gcf, 'WindowButtonUpFcn', @MouseUpFcn); % 鼠标松开时,执行MouseUpFcn
set(gcf, 'WindowButtonMotionFcn', @MouseMoveFcn); %鼠标移动时,执行MouseMoveFcn
end
function MouseClickFcn(src, event)
pt = get(gca, 'CurrentPoint');
global x1 y1 isClick;
global isDraw;
isDraw = false;
isClick = true;
x1 = pt(1, 1);
y1 = pt(1, 2); % 鼠标按下时,记录初始坐标
end
function MouseUpFcn(src, event)
global isClick;
isClick = false; % 鼠标松开时,表示当前标记结束
end
function MouseMoveFcn(src, event)global isClick;
isClick = false; % 鼠标松开时,表示当前标记结束
end
function MouseMoveFcn(src, event)
global x1 y1 x2 y2 isClick;
global h1 h2 h3 h4;
global isDraw;
if isClick == true
delete(h1);
delete(h2);
delete(h3);
delete(h4);
pt = get(gca, 'CurrentPoint');
x2 = pt(1, 1);
y2 = pt(1, 2);
if x1 < x2
x = x1;
else
x = x2;
end
if y1 < y2
y = y1;
else
y = y2;
end
h1 = plot([x1 x1], [y1 y2]);
h2 = plot([x1 x2], [y1 y1]);
h3 = plot([x2 x2], [y1 y2]);
h4 = plot([x1 x2], [y2 y2]); % 鼠标按下并移动时,动态画矩形
isDraw = false;
else
if isDraw == false
plot([x1 x1], [y1 y2]);
plot([x1 x2], [y1 y1]);
plot([x2 x2], [y1 y2]);
plot([x1 x2], [y2 y2]);
isDraw = true;
end
end
end也许有人问,为什么不直接取点下坐标和松开坐标画呢?这其实并非不可,甚至实现起来简单一大截,但这样的话,只有在最后画出来的时候,才能看到你所画的矩形,而在这之前,只有估计它大概是不是圈出了你所需的范围。所以,我最后决定动态标记,鼠标松开代表标记结束,而在这之前,程序会跟踪鼠标按下后每一刻的位置,不断地更新并显示图形。
综述:其实就是类似于C++中对鼠标或其他硬件的消息进行响应的过程!http://www/uc/myshow/blog/misc/gif/E___6717EN00SIGG.gif
加载中,请稍候......