2017-12-21 7 views
0

Ich benutze einen Projektor, um etwas auf den Boden in einem bestimmten Winkel zu projizieren. Um dies zu tun und dabei die Proportionen beizubehalten und nicht durch den Keystone-Effekt verzerrt zu werden, muss ich eine Homographiematrix finden.Holen Sie die Mausposition auf dem Bildschirm (keine Abbildung)

Was ich tun möchte, ist ein Objekt von bekannter Größe (ein Blatt A4-Papier) und legen Sie es auf den Boden. Klicken Sie dann auf seine Kanten, um ihre Positionen auf dem Bildschirm zu sehen, und berechnen Sie dann, was ich brauche.

Ich dachte an die Verwendung der get(0,'Pointerlocation') aber weiß nicht, wie man seinen Wert "auf Klick" erhalten. Vielleicht in Kombination mit input(prompt)?

Kleine Klärung, ich benutze keine Figur dahinter.

+0

Wenn Sie keine Figur verwenden, was verwenden Sie? Bitte sehen Sie: [MCVE]. – excaza

+0

Sie benötigen ein Fenster, um das Bild anzuzeigen. Dies ist eine Zahl. Wenn Sie Mausklicks in einem Fenster einer anderen Anwendung erhalten möchten, wäre Matlab definitiv das falsche Werkzeug, um dies zu tun. –

+0

Dies ist wie zwei Zeilen Code in Python. 'importiere pyautogui als pg; x, y = pg.position() ' – percusse

Antwort

2

Wenn es wirklich keine Figur gibt und Sie versuchen, Koordinaten außerhalb des Matlab Fensters/Figur und vielleicht in einer separaten Video App zu bekommen, könnten Sie etwas wie das Folgende versuchen.

Es hat im Grunde einen Countdown für Sie, um Ihre Maus irgendwo auf dem Bildschirm zu bekommen und es wird die Pixelposition Ihrer Maus auf dem Monitor zurückgeben. Sie müssen nichts anklicken. Stellen Sie nur sicher, dass Sie das Main Matlab-Fenster sehen können, damit Sie wissen, wann Sie die Maus bewegen müssen.

function screenCoord = getCorners() 
screenCoord = zeros(4,2); 

for ii = 1:4 
    fprintf('Move cursor to Position %d: \n',ii) 
    countDown() 
    screenCoord(ii,:) = get(0,'PointerLocation'); 
end 

function countDown() 
fprintf('Capturing in: '); 
for i = 5:-1:1 
    fprintf('%d..',i);pause(1) 
end 
fprintf('0..\n') 

Ausgang:

>> screenCoords = getCorners 
Move cursor to Position 1: 
Capturing in: 5..4..3..2..1..0.. 
Move cursor to Position 2: 
Capturing in: 5..4..3..2..1..0.. 
Move cursor to Position 3: 
Capturing in: 5..4..3..2..1..0.. 
Move cursor to Position 4: 
Capturing in: 5..4..3..2..1..0.. 

screenCoords = 

    113 922 
    943 904 
    976 356 
    323 376 

EDIT: Eine Alternative zum Countdown wäre die Eingabefunktion zu verwenden, solange Sie die Haupt Matlab Fenster als Fokus zu halten. Ersetzen Sie einfach den Anruf countDown() mit

input('Press Enter when ready.'); 
+0

Danke! Ich wollte etwas ähnliches (Tastatureingabe für das Timing der Aufnahme der Mausposition), hoffte aber, dass mir ein naheliegender Weg fehlt, um die Maus zu klicken :) – Vladimir

1

Der einfachste Weg in Matlab, um diese Aufgabe zu lösen, ist die Verwendung einer Figur.

würde ich eine Vollbild-Rohling Figur erstellen:

figure('position', get(0,'screensize')) 

Dann ginput() Funktion verwenden, um eine Folge von Mausklick Positionen aufnehmen:

[x,y,buttons] = ginput(4) 

Dadurch werden die vier Eckpunkte Ihres Blatt aufnehmen Wenn Sie die Maus auf dem projizierten Bild auf die Ecken Ihres "Papiers" positionieren, Das Array buttons teilt Ihnen mit, auf welche Maustaste geklickt wurde. Die Arrays x und y behalten die Position im aktuellen Achsenkoordinatensystem bei. Das Ergebnis könnte wie folgt aussehen:

x = 

    0.20783 
    0.79309 
    0.78157 
    0.15484 

y = 

    0.72422 
    0.71539 
    0.27109 
    0.22106 

buttons = 

    1 
    1 
    1 
    1 

Aus diesen Koordinaten können Sie Ihre Verzerrungsfunktion berechnen.

Weitere Optionen finden Sie unter help of ginput().

+0

' Ginput arbeitet nur mit "Achsen" -Objekten. – excaza

+0

ginput erzeugt implizit ein figure- und ein axes-Objekt, indem es die Funktion 'gca' aufruft. –

+0

Wie hilft die Erstellung eines leeren "Achsen" -Objekts? – excaza

Verwandte Themen