WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Winkelberechnung in Graphiken ohne manuellen Input

 

Ceh
Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 11.09.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.04.2018, 15:28     Titel: Winkelberechnung in Graphiken ohne manuellen Input
  Antworten mit Zitat      
Hallo liebe Community,

ich bin zwar immernoch recht neu bei Matlab, aber ich habe einen Code erstellt, der ein paar Graphiken ausgibt und mit ginput die Koordinaten ausliest, beschriftet und anschließend zum Vergleich ein best-fit kreis reinlegt, damit ich die Abstände errechnen kann. Es wäre mir noch wichtig zu wissen, wie und an er welche Stelle ich einen Part einfügen kann, an dem ich noch die Winkel zwischen den angeklickten Punkten automatisch ausgeben lassen kann. Selbst habe ich das nicht geschafft, das einzigste was mir einfallen würde, wäre die Werte rauszuschreiben und in einer Exceltabelle manuell die Winkel zu berechnen. Dies ist aber auf Dauer dann doch etwas zu umständlich. Vielleicht kann mir hier jemand helfen, wie man das automatisch einfügen kann? Als Funktion für den Best-fir-Kreis verwende ich den circfit.m. Ich hänge noch die Ausgabegraphik an, dass man sich das besser vorstellen kann.

Code:
%
close all;
clear all;
clc;

path2dir = 'C:\Users\x\Documents\MATLAB\Schnitt';
   path2dir = pwd;
end
%[A, path2jpg] = uigetfile('*.jpg', 'Select your Image', path2dir);
[A, pathname] = uigetfile( ...
{'*.m;*.mlx;*.fig;*.mat;*.slx;*.mdl',...
 'MATLAB Files (*.m,*.mlx,*.fig,*.mat,*.slx,*.mdl,)';
   '*.m;*.mlx',  'Code files (*.m,*.mlx)'; ...
   '*.fig;*.svg;*.png;*.tex;*.pdf;*.jpg','Figures (*.fig,*.svg,*.png,*.tex,*.pdf,*.jpg)'; ...
   '*.mat','MAT-files (*.mat)'; ...
   '*.mdl;*.slx','Models (*.slx, *.mdl)'; ...
   '*.*',  'All Files (*.*)'}, ...
   'Pick a file');
%[A] = uigetfile ('*.bmp', 'Select your Image');
V = imread(A)
%V = single(V);

figure('NumberTitle','off','Name',A);
imshow (V);
imagesc(flip(V));
hold on;
set(gca,'ydir','normal');%(reverse or normal). y achse gedreht, aber spiegelt immer.
%ax.YAxisLocation = 'origin'
 
colormap gray
%axis view(0,-90); %dreht das Bild. spiegelt aber auch
axis image
%axis ij   %(ji or ij) spiegelt auch das bild
axis on

%fliplr

%fadenkrezfunktion
[x,y] = ginput
           %kann später mit angeklickte Punkte nachvollziehen
           %plot kann Excel manuell beigefügt werden. Umbenennen!
plot(x,y,'--ks',...
    'LineWidth',1,...
    'MarkerSize',5,...
    'MarkerEdgeColor','r',...  
    'MarkerFaceColor',[0.5,0.5,0.5])
set(gca,'YDir','normal')
for idx = 1:numel(x)
    text(x(idx),y(idx), num2str(idx), 'Color','green','FontSize',13);
end


%Excel?!
%filename='Stegpositionen.xls';
%Excel = actxserver('Excel.Application');
%Excel.Visible = 1;
filename='Stegposition_Auswertung_Vorlage.xlsx';
xs = [ repmat('x', size(x)), num2str(x)];
ys = [ repmat('y', size(y)), num2str(y)];
xs(x=='.') = ',';

xs = cellstr( num2str(x, '%.1f') );   %4 decimal places
ys = cellstr( num2str(y, '%.1f') );

%xs = strrep(num2str(x),'.',',');
%xs_str(x=='.') = ',';
%ys_str(y=='.') = ',';

sheet=1;
xlRange = 'B6';
xlswrite('Stegposition_Auswertung_Vorlage_test.xls',xs,sheet,xlRange);
%xlswrite('Dateiname',xs,sheet,xlRange);
%xlswrite(filename,xs,sheet,xlRange);
ylRange = 'C6';
xlswrite('Stegposition_Auswertung_Vorlage_test.xls',ys,sheet,ylRange);
%xlsread ('Stegposition_Auswertung_Vorlage.xlsx');



[xfit,yfit,Rfit] = circfit(x,y);
figure ('NumberTitle','off','Name',A);
imshow(V);
plot(x,y,'r.')
hold on
rectangle('position',[xfit-Rfit,yfit-Rfit,Rfit*2,Rfit*2],...
    'curvature',[1,1],'linestyle','-','edgecolor','k');
title(sprintf('Best fit: R = %0.1f; Ctr = (%0.1f,%0.1f)',...
    Rfit,xfit,yfit));
plot(xfit,yfit,'k.')
for idx = 1:numel(x)
    text(x(idx),y(idx), num2str(idx), 'Color','green','FontSize',13);
end
axis equal
%xlim([xfit-Rfit-2,xfit+Rfit+2])  passt achsen dem kreis an
%ylim([yfit-Rfit-2,yfit+Rfit+2])
xlim([0 1600])
ylim([0 1200])
set(gca,'YDir','normal')
h = imdistline(gca);    % zum verifizieren der Pixelabstände, oder zum schnellcheck
api = iptgetapi(h);
%sheet=1;
%xlRange= 'F6';
%xlswrite('Stegposition_Auswertung_Vorlage.xlsx',r,sheet,xlRange);


%alles in einem %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
figure ('NumberTitle','off','Name',A);  
imshow(V);
imagesc(flip(V));
hold on;
set(gca,'ydir','normal')
colormap gray
axis image
axis on
grid on;
hold on;
plot(x,y,'--ks',...   %fadenkreuz
    'LineWidth',1,...
    'MarkerSize',5,...
    'MarkerEdgeColor','r',...
    'MarkerFaceColor',[0.5,0.5,0.5])
hold on;
plot(x,y,'r.')        %circfit
hold on
rectangle('position',[xfit-Rfit,yfit-Rfit,Rfit*2,Rfit*2],...
    'curvature',[1,1],'linestyle','-','edgecolor','k');
title(sprintf('Best fit: R = %0.1f; Ctr = (%0.1f,%0.1f)',...
    Rfit,xfit,yfit));
plot(xfit,yfit,'k.')
for idx = 1:numel(x)
    text(x(idx),y(idx), num2str(idx), 'Color','green','FontSize',13);
end
%xlim([xfit-Rfit-2,xfit+Rfit+2])
%ylim([yfit-Rfit-2,yfit+Rfit+2])
xlim([0 1600])
ylim([0 1200])
%%%Dieses Bild in vorgefertige Excel speichern
 


und hier die circfit Funktion:
Code:
%
function   [xc,yc,R,a] = circfit(x,y)
%
%   [xc yx R] = circfit(x,y)
%
%   fits a circle  in x,y plane in a more accurate
%   (less prone to ill condition )
%  procedure than circfit2 but using more memory
%  x,y are column vector where (x(i),y(i)) is a measured point
%
%
%  result is center point (yc,xc) and radius R
%  an optional output is the vector of coeficient a
% describing the circle's equation
%
%   x^2+y^2+a(1)*x+a(2)*y+a(3)=0
%
%  By:  Izhak bucher 25/oct /1991,
    x=x(:); y=y(:);
   a=[x y ones(size(x))]\[-(x.^2+y.^2)];
   xc = -.5*a(1);
   yc = -.5*a(2);
   R  =  sqrt((a(1)^2+a(2)^2)/4-a(3));
 


Danke schonmal für's lesen und ich hoffe, es kann mir einer helfen.
Liebe Grüße an alle.


Edit. Wie macht man, dass die Werte, die in die Exceldatei geschrieben werden dort mit Kommas auftauchen, und nicht mit Punkt? Also, dass anstatt 345.26 in der Exceldatei dann 345,26 steht?

S25_1.jpg
 Beschreibung:

Download
 Dateiname:  S25_1.jpg
 Dateigröße:  88.92 KB
 Heruntergeladen:  299 mal
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.432
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 02.04.2018, 17:12     Titel:
  Antworten mit Zitat      
Hallo,

wenn du den Winkel in Excel ausrechnen kannst, warum nicht in MATLAB?
Ich würde zwei Geraden von einem Punkt durch die beiden anderen legen, dann die Steigungen dieser Geraden bestimmen, daraus den Winkel zur x-Achse und dann die Winkel voneinander abziehen.

Warum wandelst du die numerischen Daten in Strings um, bevor du sie nach Excel schreibst? Wenn du Excel entsprechend eingestellt hast, sollten Zahlen dort immer mit , als Dezimaltrennzeichen erscheinen.
Inwiefern funktioniert dein strrep-Ansatz nicht wie gewünscht?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Ceh
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 11.09.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.04.2018, 21:20     Titel:
  Antworten mit Zitat      
hallo,
danke schonmal für deine Antwort.
Aber ich wäre eher auf der Suche nach einer Funktion, die meine Werte und den Mittelpunkt automatisch erkennt und dann die Winkel sofort nach Eingabe durch ginput ausrechnet. Ich wollte es eben nicht alles einzeln ausrechnen, da dies ja nur ein Beispiel ist und ich da eine große Datenmenge habe, wo dann das manuelle ausrechnen nicht sehr zeit-effizient wäre.

Danke und Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.432
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 04.04.2018, 19:35     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
die meine Werte und den Mittelpunkt automatisch erkennt

Was genau soll woraus wie automatisch erkannt werden??

Zitat:
Ich wollte es eben nicht alles einzeln ausrechnen, da dies ja nur ein Beispiel ist und ich da eine große Datenmenge habe, wo dann das manuelle ausrechnen nicht sehr zeit-effizient wäre.

In der Regel ist das auch nicht nötig, sondern kann über Schleifen oder auch vektorisiert abgearbeitet werden. Mir ist allerdings schleierhaft, was du eigentlich machen willst.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.