Python 基于两点法的单摄像机图像校正

Python 基于两点法的单摄像机图像校正,python,opencv,camera,homography,perspectivecamera,Python,Opencv,Camera,Homography,Perspectivecamera,我正在尝试实施图像校正。我使用的是一个不再可用的软件。为了校正图像,软件使用相机的高度(h)、两个点(d1、d2)与相机之间的距离以及图像中的对应线与参考点(第1行、第2行)之间的距离。 因此,变量是: h(摄像机仰角) 第1行、第2行(行像素) d1、d2(与摄像机的距离,以米为单位) 配置: 我尝试使用OpenCV(Python)实现一些代码,但最终的结果与软件不一样。我写了一个代码来校准相机,一秒钟来消除图像的失真,然后我想进行校正。 问题是,我使用的是一台固定焦距和焦距的相机(拍摄

我正在尝试实施图像校正。我使用的是一个不再可用的软件。为了校正图像,软件使用相机的高度(h)、两个点(d1、d2)与相机之间的距离以及图像中的对应线与参考点(第1行、第2行)之间的距离。 因此,变量是:

  • h(摄像机仰角)
  • 第1行、第2行(行像素)
  • d1、d2(与摄像机的距离,以米为单位)
配置:

我尝试使用OpenCV(Python)实现一些代码,但最终的结果与软件不一样。我写了一个代码来校准相机,一秒钟来消除图像的失真,然后我想进行校正。 问题是,我使用的是一台固定焦距和焦距的相机(拍摄风景照片),我不能再改变了。 有人能告诉我一个很好的方法来执行纠正使用相同的方式的软件或其他有效的解决方案

我的校准代码是

# Numbers of corners
n_w = 9
n_h = 6
patternSize = (n_w, n_h)
# SIZE OF THE WINDOW TO IMPROVE THE COORDINATES OF CORNERS
windowSize = (11, 11)
# TERMINATION CRITERIA
criteria = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
objp = np.zeros((n_h * n_w, 3), dtype=np.float32)
objp[:, :2] = np.mgrid[0:n_w, 0:n_h].T.reshape(-1, 2)
# LIST OF POINT
objpoints = []
imgpoints = []
# GET ALL IMAGES
images = glob.glob('*.jpg')

for fname in images:
img = cv2.imread(fname)

# IMAGE ON GRAY SACLE
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# fIND CORNERS
retval, corners = cv2.findChessboardCorners(gray_img, patternSize, None)

if retval == True:
    print 'Looping through image %s' % fname
    objpoints.append(objp)
    cv2.cornerSubPix(gray_img, corners, windowSize, (-1, -1), criteria)
    imgpoints.append(corners)
    cv2.drawChessboardCorners(img, patternSize, corners, retval)
    cv2.imshow('ChessBoard Image %s' % fname, img)
    cv2.waitKey(500)
    cv2.destroyAllWindows()

    print "------START CALIBRATION....."
    ret, cameraMatrix, distCoeffs, revcs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray_img.shape[::-1],
                                                                      None, None)
    print ret
    print cameraMatrix
    print distCoeffs
    print '---SAVING CALIBRATION DATA'
    np.savez('calibration_data', RMS=ret, distCoeffs=distCoeffs, cameraMatrix=cameraMatrix)
    if ret <= 1.0:
        print '''-----GOOD CALIBRATION'''
校正图像的第一个想法是找到梯形(A4纸张)真实世界图像中的4个角,并计算给定矩形4个点的变换矩阵(A4的真实尺寸)。但我认为这是一种错误的做法。 为此,我编写了以下代码:

#load image
img_Trap = cv2.imread('image.png', cv2.IMREAD_GRAYSCALE)
#points on the image (corners of an A4 paper)
ptsTrap = np.array(((1556, 1050), (1556, 1050), (2189, 1677), (1425, 1723)), dtype=np.float32)

img_Rect = cv2.imread('image2.png', cv2.IMREAD_GRAYSCALE)
# corner of a A4 (saving the aspect ratio)
ptsRect = np.array(((1980, 1381), (2189, 1381), (2189, 1677), (1980, 1677)), dtype=np.float32)
#transformation matrix
T = cv2.getPerspectiveTransform(ptsTrap, ptsRect)
print T
# warp perspective
warp = cv2.warpPerspective(img_Trap, T, img_Rect.shape[:2])
cv2.imwrite('warpimage.png', warp)

你应该展示你迄今为止所做的努力。请看如何做一个你写的代码?它在哪里?我已经重新编辑了ask。。谢谢你的邀请help@ArLe你设法纠正了这个形象吗?
#load image
img_Trap = cv2.imread('image.png', cv2.IMREAD_GRAYSCALE)
#points on the image (corners of an A4 paper)
ptsTrap = np.array(((1556, 1050), (1556, 1050), (2189, 1677), (1425, 1723)), dtype=np.float32)

img_Rect = cv2.imread('image2.png', cv2.IMREAD_GRAYSCALE)
# corner of a A4 (saving the aspect ratio)
ptsRect = np.array(((1980, 1381), (2189, 1381), (2189, 1677), (1980, 1677)), dtype=np.float32)
#transformation matrix
T = cv2.getPerspectiveTransform(ptsTrap, ptsRect)
print T
# warp perspective
warp = cv2.warpPerspective(img_Trap, T, img_Rect.shape[:2])
cv2.imwrite('warpimage.png', warp)