2017-06-16 307 views
0

我想找到变换矩阵H,这样我就可以乘以(x,y)像素坐标并获得(x,y)真实世界坐标。这是我的代码:Opencv单应性从像素xy坐标找到全局xy坐标

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) 

我得到的全球xy是非常关闭。我在某处做错了什么?

+0

对不起,但是变量'D,I,G,A,O,X,P,Y'是什么?这些应该代表什么?无论如何,在你计算“真实世界”(x,y)坐标的地方,你将得到*均匀*点,它们在缩放时是等价的 - 换句话说,它们可以被缩放并且仍然会被考虑同样的观点。但是你需要'x,y'点,而不是缩放的点,所以你需要按比例分割。三矢量全部按照相同的量进行缩放,因此您可以使用缩放因子的最后一个条目。你应该做'pts = scale * np.dot(h,np.array([[323.0],[120.0],[1.0]]))'然后'pts = pts/pts [-1]'。 –

+0

OXPY是真实的单词点(O原点,右侧X-134英寸,右侧P-134英寸,向下184英寸,Y-184英寸)和DIGA是图像平面上的相应像素坐标。 –

+0

对不起。我没有得到比例缩放部分。 –

回答

3

长的答案

单应是3x3矩阵和点只是对,2x1,所以没有办法一起绘制这些。相反,使用齐次坐标,使3x1向量相乘。但是,同样的点可以在代表相同点的同时进行缩放;即齐次坐标中,(kx,ky,k)(x,y,1)相同。从Wikipedia page on homogeneous coordinates

给定一个点(X,Y)上的欧几里得平面,对于任何非零实数Ž,三联(XZ,YZ,Z)被称为该点的齐次坐标集。通过这个定义,将三个齐次坐标乘以一个公共的非零因子给出同一点的一组新齐次坐标。特别地,(x,y,1)是点(x,y)的齐次坐标系统。例如,笛卡尔点(1,2)可以在均匀坐标中表示为(1,2,1)(2,4,2)。通过将前两个位置除以第三个来恢复原始笛卡尔坐标。因此,与笛卡尔坐标不同,单个点可以用无限多的齐次坐标表示。

显然,在笛卡尔坐标系中,这种缩放不成立; (X,Y)是不一样的点作为(XZ,YZ)除非Z = 0或Z = 1。所以我们需要一种方法来映射这些齐次坐标,这些坐标可以用无数种方式表示,直到笛卡尔坐标,这些坐标只能用一种方式表示。幸运的是,这很容易,只是缩放齐次坐标,因此三元组中的最后一个数字是。

Homographies乘以齐次坐标并返回齐次坐标。因此,为了将它们映射回笛卡尔世界,您只需要除以最后一个坐标来缩放它们,然后撕掉前两个数字。

简短的回答

当您通过单应乘以齐次坐标,你需要扩展他们:

sx'  x 
sy' = H * y 
s   1 

所以要回笛卡尔坐标,通过小号划分新齐次坐标:(x',y')是您想要的点。

较短的答案

使用内置OpenCV的功能convertPointsFromHomogeneous()你百分点同质3向量以笛卡尔2向量转换。