鼠标在图像中划线,返坐标值

1.比较笨的方法

function  MAS=zhongzidian(img_name,N)
 [cow,rol,win]=size(img_name);
 MAS=zeros(cow,rol);% 坐标值返回到MAS中
V=ginput(N)  % 鼠标左键点3个点之后自动结束,结果保存在V中
  line(V(:,1),V(:,2),'Color','r','LineWidth',4)
V=round(V');

for i=1:N
    MAS(V(2,i),V(1,i))=1; 
  end

这种方法只能事先确定好划线的点数划线,线条精度不够,返回值只有确定的几个点

2.调用鼠标属性

function   mouse(action)
global C;
global W;
global img_name;
global MASK;
global MAS;
C='Black';
W=5;
global x y x0 y0;
if nargin == 0
    action = 'start';
end
switch(action)
    % 开启图形视窗
    case 'start'
%       global img_fg;
       f=size(img_name);
        title('在这个窗口单击并拖动鼠标!');
        %设定滑鼠按钮被按下时的反应指令为「tmouse down」
        set(gcf, 'WindowButtonDownFcn', 'mouse down');
        % 滑鼠按钮被按下时的反应指令
    case 'down'
        % 设定滑鼠移动时的反应指令为「tmouse move」
        set(gcf, 'WindowButtonMotionFcn', 'mouse move');
        % 设定滑鼠按钮被释放时的反应指令为「tmouse up」
        set(gcf, 'WindowButtonUpFcn', 'mouse up');
        currPt = get(gca, 'CurrentPoint');
        x0 = currPt(1,1);
        y0 = currPt(1,2);
        % 列印「Mouse down!」讯息
        % fprintf('Mouse down!\n');
        % 滑鼠移动时的反应指令
        x0=round(x0);
        y0=round(y0);
        MAS(x0,y0)=1;      %返回坐标值
    case 'move'
        currPt = get(gca, 'CurrentPoint');
        x = currPt(1,1);
        y = currPt(1,2);
        %line(x, y, 'marker', '.','markerSize',28, 'LineStyle','-','LineWidth',4,'Color','Red');
        line(x,y, 'marker', '.','markerSize',2*W, 'LineStyle','-','LineWidth',W,'Color',C);
        %%当鼠标移动非常快时,上边的程序只能画一些分离的点,一下程序是为了把前后相邻的点连起来。
        %%利用中学的y=kx+b直线方程实现。
        x_gap=0.1 ;%定义x方向增量
        y_gap=0.1 ;%定义y方向增量
        if x>x0
            step_x=x_gap;
        else
            step_x=-x_gap;
        end
        if y>y0
            step_y=y_gap;
        else
            step_y=-y_gap;
        end
        X=x0:step_x:x ;        %%定义x的变化范围和步长
                                %%以下定义y的变化范围和步长
        if abs(x-x0)<0.01              %%直线平行于y轴
            Y=y0:step_y:y;     %%斜率不存在时,y值固定
        else
            Y=(y-y0)*(X-x0)/(x-x0)+y0;   %当斜率存在,k=(y-y0)/(x-x0)~=0
        end
        line( X ,Y, 'marker', '.','markerSize',2*W, 'LineStyle','-','LineWidth',W,'Color',C);%%补一条直线,当鼠标跳跃移动时

        % end
        x0=x;                          %记住当前点坐标
        y0=y;                         %记住当前点坐标
        %plot(x,y, 'marker', '.');
        %'EraseMode', 'xor',
        % 列印「Mouse is moving!」讯息及滑鼠现在位置
        %fprintf('Mouse is moving! Current location = (%g, %g)\n', currPt(1,1), currPt(1,2));
        % 滑鼠按钮被释放时的反应指令
        x0=round(x0)
        y0=round(y0)
        MAS(x0,y0)=1
      
    case 'up'
        % 清除滑鼠移动时的反应指令
        set(gcf, 'WindowButtonMotionFcn', '');
        % 清除滑鼠按钮被释放时的反应指令
        set(gcf, 'WindowButtonUpFcn', '');
        % 列印「Mouse up!」讯息
        %fprintf('Mouse up!\n');
        
end

这种方法线倒可以在图上随便画,但是如何停止呢,试了return也不行,求大神指点

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值