OpenCV Point Undistortion

时间:2017-04-12 21:19:34

标签: python opencv camera raspberry-pi distortion

我正在使用Raspberry Pi 2和官方的500万像素相机。我使用OpenCV 3.2.0校准了相机。我在Python 3.4.2编码(我知道它不是最新版本,但重新编译OpenCV的新版本是不可能的。)

我的问题是,如果我在相对于相机的正方形内有一个点,并且我有相对于相机的正方形的所有4个角的点(不完全是正方形,因为它可能会旋转并稍微移动) ,我如何找到相对于广场的那个点?

例如,如果正方形的左上角是(10,20),并且原始点有点向右和向下,可能(21,33),那么最后一点可能是类似的(15,18)。

将此结果基于1个角(并且仅减去输入点和角点)是不够的,因为图像可能会缩放。将其基于2个相对的角(假设正方形是完全正方形而不是旋转)是不够的,因为图像可能会旋转。从理论上讲,如果我正确校准相机(并制作完美的正方形或矩形),3应该足够了,但4最好完全确定。

问题是我不知道如何将图像上的点重新映射到正方形上的点。我该怎么做?

示例(抱歉质量低):

Checkerboard Checkerboard with input points: [(163, 17) -> (0, 0), (294, 50) -> (5, 0), (313, 273) -> (5, 8), and (145, 275) -> (0, 8)], output point: (257, 149) -> (3.5, 4)

鉴于4个红色摄像头和输出点以及绿色摄像头,如何找到绿色输出点?

1 个答案:

答案 0 :(得分:0)

写完之后(我发誓我刚写完),我发现了这个功能:cv2.getPerspectiveTransform()。以下是该示例的用法:

rows = 5
columns = 8
inputs = [(163, 17), (294, 50), (313, 273), (145, 275)]
outputs = [(0, 0), (5, 0), (5, 8), (0, 8)]

transform_matrix = cv2.getPerspectiveTransform(inputs, outputs)

def transform(point):
    global transform_matrix
    return cv2.perspectiveTransform(point, transform_matrix)