2017-06-16 2 views
0

Ich versuche die Transformationsmatrix H zu finden, so dass ich die (x, y) Pixelkoordinaten multiplizieren und die (x, y) realen Weltkoordinaten erhalten kann. Hier ist mein Code:Opencv-Homographie zum Auffinden globaler xy-Koordinaten aus Pixel xy-Koordinaten

import cv2 
import numpy as np 
from numpy.linalg import inv 
if __name__ == '__main__' : 
D=[159.1,34.2] 
I=[497.3,37.5] 
G=[639.3,479.7] 
A=[0,478.2] 
# Read source image. 
im_src = cv2.imread('/home/vivek/june_14.png') 
# Four corners of the book in source image 
pts_src = np.array([D,I,G,A]) 

# Read destination image. 
im_dst = cv2.imread('/home/vivek/june_14.png') 

# Four corners of the book in destination image. 
print "img1 shape:",im_dst.shape 
scale=1 
O=[0.0,0.0] 
X=[134.0*scale,0] 
Y=[0.0,184.0*scale] 
P=[134.0*scale,184.0*scale] 
# lx = 75.5 * scale 
# ly = 154.0 * scale 
pts_dst = np.array([O,X,P,Y]) 

# Calculate Homography 
h, status = cv2.findHomography(pts_src, pts_dst) 

print "homography:",h 
print "inv of H:",inv(h) 
print "position of the blob on the ground xy plane:",np.dot(np.dot(h,np.array([[323.0],[120.0],[1.0]])),scale) 


# Warp source image to destination based on homography 

im_out = cv2.warpPerspective(im_src, h, (im_dst.shape[1],im_dst.shape[0])) 

# Display images 
cv2.imshow("Source Image", im_src) 
cv2.imshow("Destination Image", im_dst) 
cv2.imshow("Warped Source Image", im_out) 
cv2.imwrite("im_out.jpg", im_out) 
cv2.waitKey(0) 

Die globalen XY's, die ich bekomme, sind sehr aus. Mache ich irgendwo etwas falsch?

+0

Sorry, aber was sind die Variablen 'D, I, G, A, O, X, P, Y'? Was sollen diese darstellen? Wie auch immer, wo Sie die Koordinaten der "realen Welt" (x, y) berechnen, erhalten Sie * homogene * Punkte, die äquivalent sind, wenn sie skaliert werden - mit anderen Worten, sie können skaliert werden und würden immer noch berücksichtigt werden der gleiche Punkt. Aber du brauchst 'x, y' Punkte, keine skalierten, also musst du durch die Skala dividieren. Der Drei-Vektor wird alle um den gleichen Betrag skaliert, so dass Sie den letzten Eintrag für den Skalierungsfaktor verwenden können. Sie sollten 'pts = scale * np.dot (h, np.array ([[323.0], [120.0], [1.0]]))' und dann 'pts = pts/pts [-1]' machen. –

+0

OXPY sind echte Wortpunkte (O-Ursprung, X-134 Zoll nach rechts, P-134 Zoll nach rechts und 184 Zoll nach unten, Y-184 Zoll nach unten) und DIGA sind die jeweiligen Pixelkoordinaten auf der Bildebene. –

+0

Es tut mir leid. Ich habe den Skalierungsteil nicht ganz bekommen. –

Antwort

3

Die lange Antwort

Homographien sind 3x3 Matrizen und Punkte nur Paare sind, 2x1, also gibt es keine Möglichkeit, diese zusammen zu kartieren. Stattdessen werden homogene Koordinaten verwendet, die Vektoren zum Multiplizieren geben. Jedoch können homogene Punkte skaliert werden, während sie denselben Punkt darstellen; das heißt, in homogenen Koordinaten ist (kx, ky, k) der gleiche Punkt wie (x, y, 1). Vom Wikipedia page on homogeneous coordinates:

ein Punkt (x, y) auf der euklidischen Ebene gegeben, für jede Nicht-Null-reelle Zahl Z, das Tripel (XZ, YZ, Z) heißt a Satz von homogenen Koordinaten für den Punkt. Nach dieser Definition ergibt die Multiplikation der drei homogenen Koordinaten mit einem gemeinsamen Faktor ungleich Null einen neuen Satz homogener Koordinaten für denselben Punkt. Insbesondere ist (x, y, 1) ein solches System von homogenen Koordinaten für den Punkt (x, y). Beispielsweise kann der kartesische Punkt (1, 2) in homogenen Koordinaten wie (1, 2, 1) oder (2, 4, 2) dargestellt werden. Die ursprünglichen kartesischen Koordinaten werden wiederhergestellt, indem die ersten beiden Positionen durch die dritte geteilt werden. Anders als bei kartesischen Koordinaten kann also ein einzelner Punkt durch unendlich viele homogene Koordinaten dargestellt werden.

Offensichtlich gilt diese Skalierung in kartesischen Koordinaten nicht; (x, y) ist nicht der gleiche Punkt wie (XZ, YZ), es sei dennZ = 0 oderZ = 1. Wir brauchen also eine Möglichkeit, diese homogenen Koordinaten, die auf unendlich viele Arten dargestellt werden können, kartesischen Koordinaten zuzuordnen, die nur in einer Richtung dargestellt werden können. Zum Glück ist das sehr einfach, skalieren Sie die homogenen Koordinaten einfach so, dass die letzte Zahl im Triple ist.

Homographien multiplizieren homogene Koordinaten und geben homogene Koordinaten zurück. Um sie also zurück in die kartesische Welt zu mappen, müssen Sie nur durch die letzte Koordinate dividieren, um sie zu skalieren und dann die ersten beiden Zahlen herauszureißen.

Die kurze Antwort

Wenn Sie homogenen Koordinaten durch einen Homografie multiplizieren, Sie brauchen, um sie zu skalieren:

sx'  x 
sy' = H * y 
s   1 

So zu rechtwinkligen Koordinaten zu kommen, um die neuen homogenen Koordinaten dividieren durch s : (sx ', sy', s)/s = (x ', y', 1) und dann (x ', y') sind die Punkte, die Sie wollen.

Die kürzere Antwort

über die eingebauten in OpenCV Funktion convertPointsFromHomogeneous() Ihre Punkte aus homogenen 3-Vektoren zu cartesianischen 2-Vektoren zu konvertieren.

Verwandte Themen