pythonとOpenCVでカメラキャリブレーション(1個のカメラの内部パラメータと歪み係数を求める)するコード(パクリ)
パクりました。
# -*- coding: utf-8 -*- import numpy import cv2 from glob import glob def main(): square_size = 1.0 # 正方形のサイズ pattern_size = (10, 7) # 模様のサイズ pattern_points = numpy.zeros( (numpy.prod(pattern_size), 3), numpy.float32 ) #チェスボード(X,Y,Z)座標の指定 (Z=0) pattern_points[:,:2] = numpy.indices(pattern_size).T.reshape(-1, 2) pattern_points *= square_size obj_points = [] img_points = [] for fn in glob("*.jpg"): # 画像の取得 im = cv2.imread(fn, 0) print "loading..." + fn # チェスボードのコーナーを検出 found, corner = cv2.findChessboardCorners(im, pattern_size) # コーナーがあれば if found: term = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_COUNT, 30, 0.1) cv2.cornerSubPix(im, corner, (5,5), (-1,-1), term) # コーナーがない場合のエラー処理 if not found: print 'chessboard not found' continue img_points.append(corner.reshape(-1, 2)) #appendメソッド:リストの最後に因数のオブジェクトを追加 obj_points.append(pattern_points) #corner.reshape(-1, 2) : 検出したコーナーの画像内座標値(x, y) # 内部パラメータを計算 rms, K, d, r, t = cv2.calibrateCamera(obj_points,img_points,(im.shape[1],im.shape[0])) # 計算結果を表示 print "RMS = ", rms print "K = \n", K print "d = ", d.ravel() # 計算結果を保存 numpy.savetxt("rms.csv", rms, delimiter =',',fmt="%0.14f") numpy.savetxt("K.csv", K, delimiter =',',fmt="%0.14f") if __name__ == '__main__': main()
ついでにコードに要らないコメントを書き込んで見にくくしてやりました*1
画像取得は、中で何やってるかよくわからんですが、ソースがあるフォルダ内の画像をfor文で
順番に呼んでくれる感じです。
*1:ゲヘー