0

I've read several articles about how to output data to file, but it just doesnt seem to work for me. I have output.txt file at the same folder as my matlab file resides and it just doesn't output any data to that file?

What is wrong with it? I want to output coordinates as you click on image, so all output logic is in the listener.

function main 
    clc; close all;
    % set the range of the axes
    % The image will be stretched to this.
    min_x = 0;
    max_x = 1;
    min_y = 0;
    max_y = 1;

    % replace with an image of your choice
    img = imread('ryklys.jpg');

    imagesc([min_x max_x], [min_y max_y], flipud(img));
    hold on;
    colormap(gray);

    set(gca,'ydir','normal')

    cursor_handle = plot(0,0,'r+ ','visible','off')

    % now attach the function to the axes
    set(gca,'ButtonDownFcn', @mouseclick_callback)

    % and we also have to attach the function to the children, in this
    % case that is the line in the axes.
    set(get(gca,'Children'),'ButtonDownFcn', @mouseclick_callback)



   function mouseclick_callback(gcbo,eventdata)
      % the arguments are not important here, they are simply required for
      % a callback function. we don't even use them in the function,
      % but Matlab will provide them to our function, we we have to
      % include them.
      %
      % first we get the point that was clicked on
      cP = get(gca,'Currentpoint');
      x = cP(1,1);
      y = cP(1,2);
      % Now we find out which mouse button was clicked, and whether a
      % keyboard modifier was used, e.g. shift or ctrl
      switch get(gcf,'SelectionType')
          case 'normal' % Click left mouse button.
              s = sprintf('left: (%1.4g, %1.4g) level = %1.4g',x,y, x.*exp(-x.^2-y.^2));
          case 'alt'    % Control - click left mouse button or click right mouse button.
              s = sprintf('right: (%1.4g, %1.4g level = %1.4g)',x,y, x.*exp(-x.^2-y.^2));
          case 'extend' % Shift - click left mouse button or click both left and right mouse buttons.
              s = sprintf('2-click: (%1.4g, %1.4g level = %1.4g)',x,y, x.*exp(-x.^2-y.^2));
          case 'open'   % Double-click any mouse button.
              s = sprintf('double click: (%1.4g, %1.4g) level = %1.4g',x,y, x.*exp(-x.^2-y.^2));
      end
      % get and set title handle
      thandle = get(gca,'Title');
      set(thandle,'String',s);
      % finally change the position of our red plus, and make it
      % visible.
      set(cursor_handle,'Xdata',x,'Ydata',y,'visible','on')

      % append file with coordinates
      plot(x,y,'r.','MarkerSize',20);

      % Output to file 
        fid=fopen('output.txt','w');
        fprintf(fid, '%4.2f %4.2f \n', x, y);
        fclose(fid);
  end
end

This project is about how to get coordinates on image mouse click and to output point coordinates to file.

2
  • 1
    The w permission in fopen discards current content - so it seems like on every callback the existing file is discarded. You should probably (append) a instead... Also consider the t option since you are writing ascii and not binary. Commented Jun 7, 2015 at 8:31
  • but with w enabled there should still be one last point in the file remaining, right? also, tried wt, and still nothing Commented Jun 7, 2015 at 8:42

1 Answer 1

0

When first time launching this file, be sure to select "change folder" instead of "adding file to path". When I selected "change folder" Matlab was able to write data in the 'output.txt' file. Also, as Dev-iL suggested I added append mode, final code looks like this

function main 
    clc; close all;
    % Total points counter 
    counter = 0;

    % set the range of the axes
    % The image will be stretched to this.
    min_x = 0;
    max_x = 1;
    min_y = 0;
    max_y = 1;

    % replace with an image of your choice
    img = imread('ryklys.jpg');

    imagesc([min_x max_x], [min_y max_y], flipud(img));
    hold on;
    colormap(gray);

    set(gca,'ydir','normal')

    cursor_handle = plot(0,0,'r+ ','visible','off')

    % now attach the function to the axes
    set(gca,'ButtonDownFcn', @mouseclick_callback)

    % and we also have to attach the function to the children, in this
    % case that is the line in the axes.
    set(get(gca,'Children'),'ButtonDownFcn', @mouseclick_callback)

%     % Output to file 
    outputFile = 'output.txt';
    fid=fopen(outputFile,'wt');
    fclose(fid);

   function mouseclick_callback(gcbo,eventdata)
      % the arguments are not important here, they are simply required for
      % a callback function. we don't even use them in the function,
      % but Matlab will provide them to our function, we we have to
      % include them.
      %
      % first we get the point that was clicked on
      cP = get(gca,'Currentpoint');
      x = cP(1,1);
      y = cP(1,2);
      % Now we find out which mouse button was clicked, and whether a
      % keyboard modifier was used, e.g. shift or ctrl
      switch get(gcf,'SelectionType')
          case 'normal' % Click left mouse button.
              s = sprintf('left: (%1.4g, %1.4g) level = %1.4g',x,y, x.*exp(-x.^2-y.^2));
          case 'alt'    % Control - click left mouse button or click right mouse button.
              s = sprintf('right: (%1.4g, %1.4g level = %1.4g)',x,y, x.*exp(-x.^2-y.^2));
          case 'extend' % Shift - click left mouse button or click both left and right mouse buttons.
              s = sprintf('2-click: (%1.4g, %1.4g level = %1.4g)',x,y, x.*exp(-x.^2-y.^2));
          case 'open'   % Double-click any mouse button.
              s = sprintf('double click: (%1.4g, %1.4g) level = %1.4g',x,y, x.*exp(-x.^2-y.^2));
      end
      % get and set title handle
      thandle = get(gca,'Title');
      set(thandle,'String',s);
      % finally change the position of our red plus, and make it
      % visible.
      set(cursor_handle,'Xdata',x,'Ydata',y,'visible','on')

      % append file with coordinates
      plot(x,y,'r.','MarkerSize',20);

      % Increasing counter value
      counter = counter + 1;
      % Printing out points counter value
      text(x,y, strcat('#', int2str(counter)), 'color', 'r');

      % Output to file 
      fid=fopen(outputFile,'at');
      fprintf(fid, '%f %f %s %d\n', x, y, '; %', counter);
      fclose(fid);
  end
end
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.