2017-06-13 690 views
1

我正在尝试使用omnidirectional module来解除鱼眼图像Python。我试图在Python中修改C++ tutorial,但遇到问题。这里是我的代码:如何使用opencv.omnidir模块来解构鱼眼图像

import numpy as np 
import cv2 
import glob 

nx = 9 
ny = 6 

# termination criteria 
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001) 

chessboard_model = np.zeros((1, nx*ny, 3), np.float32) 
chessboard_model[0, :, :2] = np.mgrid[0:nx, 0:ny].T.reshape(-1, 2) 

# prepare object points, like (0,0,0), (1,0,0), (2,0,0) ....,(6,5,0) 
objp = np.zeros((nx*ny, 3), np.float32) 
objp[:,:2] = np.mgrid[0:nx, 0:ny].T.reshape(-1,2) 

# Arrays to store object points and image points from all the images. 
objpoints = [] # 3d point in real world space 
imgpoints = [] # 2d points in image plane. 

filenames = glob.glob('/home/work/Downloads/fisheye_calibration/*.jpg') 
images = [] 
i = 0 
for fname in filenames: 
    i += 1 
    print("Processing image: {}".format(i)) 
    img = cv2.imread(fname) 
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) 
    images.append(img) 

    # Find the chess board corners 
    ret, corners = cv2.findChessboardCorners(gray, (nx,ny),None) 
    # If found, add object points, image points (after refining them) 
    if ret == True: 
     objpoints.append(objp) 
     corners2 = cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),criteria) 
     #imgpoints.append(corners2) 
     imgpoints.append(corners2.reshape(1, -1, 2)) 

     # Draw and display the corners 
     img = cv2.drawChessboardCorners(img, (nx,ny), corners2,ret) 
     cv2.imshow('img',img) 
     cv2.waitKey(500) 

num_points = len(imgpoints) 
K = np.zeros((3, 3)) 
xi = np.array([]) 
idx = np.array([]) 
D = np.zeros((4, 1)) 
h, w = images[0].shape[:2] 
calibration_flags = cv2.omnidir.CALIB_USE_GUESS | cv2.omnidir.CALIB_FIX_SKEW 
obj_points_arr = np.array([chessboard_model]*num_points) 
img_points_arr = np.array(imgpoints).squeeze(axis=1) 
rms = cv2.omnidir.calibrate(obj_points_arr, img_points_arr, (w,h), K, xi, D, calibration_flags, criteria) 

我收到以下错误:分别

cv2.error:/home/work/opencv_contrib/modules/ccalib/src/omnidir.cpp:1065: error: (-215) !patternPoints.empty() && !imagePoints.empty() && patternPoints.total() == imagePoints.total() in function calibrate 

这里obj_points_arrimg_points_arrnum_points x 1 x (nx * ny) x 3num_points x 1 x (nx * ny) x 2。如果我重塑obj_points_arrimg_points_arrnum_points x (nx * ny) x 3num_points x (nx * ny) x 2使用

obj_points_arr = np.array([chessboard_model]*num_points).squeeze(axis=1) 
img_points_arr = np.array(imgpoints).squeeze(axis=1) 

然后我收到以下错误

cv2.error: /home/work/opencv/modules/core/src/matrix.cpp:469: error: (-215) 0 <= _rowRange.start && _rowRange.start <= _rowRange.end && _rowRange.end <= m.rows in function Mat 

应该是什么这些阵列的形状?有人可以分享他们的python代码来预览鱼眼图片吗?

回答

0

首先你没有得到图像的角落,最好写到其他和打印出来。

else: print "not found: "+fname

可以使用pyfisheye的模块来完成你的任务。 https://bitbucket.org/amitibo/pyfisheye