今回はOpenCV+AruCoを利用する前準備として、使用するウェブカメラのキャリブレーションを行います。
詳しいことは省きますが、このプログラムを実行すると
"mtx.npy"というカメラ行列の出力ファイルと"dist.npy"という歪みパラメータのファイルが出力されます。これは、次からマーカーの検出などをするときにカメラから出力される映像を補正するのに使います。
ちなみに私は
- import cv2
- import matplotlib.pyplot as plt
- import numpy as np
- square_size = 2 #印刷した人ます分の長さ
- pattern_size = (7, 7)
- reference_img = 50
- pattern_points = np.zeros( (np.prod(pattern_size), 3), np.float32 )
- pattern_points[:,:2] = np.indices(pattern_size).T.reshape(-1, 2)
- pattern_points *= square_size
- objpoints = []
- imgpoints = []
- capture = cv2.VideoCapture(0)
- while len(objpoints) < reference_img:
- ret, img = capture.read()
- height = img.shape[0]
- width = img.shape[1]
- gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
- ret, corner = cv2.findChessboardCorners(gray, pattern_size)
- if ret == True:
- display("detected coner!")
- display(str(len(objpoints)+1) + "/" + str(reference_img))
- term = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_COUNT, 30, 0.1)
- cv2.cornerSubPix(gray, corner, (5,5), (-1,-1), term)
- imgpoints.append(corner.reshape(-1, 2))
- objpoints.append(pattern_points)
- cv2.imshow('image', img)
- if cv2.waitKey(100) & 0xFF == ord('q'):
- break
- display("calculating camera parameter...")
- ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None)
- np.save("mtx", mtx)
- np.save("dist", dist.ravel())
- capture.release()
- cv2.destroyAllWindows()
詳しいことは省きますが、このプログラムを実行すると
というようにチェス盤すべてが画面内に入っているときに画像の読み込みが始まっていき、
"mtx.npy"というカメラ行列の出力ファイルと"dist.npy"という歪みパラメータのファイルが出力されます。これは、次からマーカーの検出などをするときにカメラから出力される映像を補正するのに使います。
ちなみに私は
mtx =
array([[1.09857661e+04, 0.00000000e+00, 3.85026317e+02], [0.00000000e+00, 3.88955066e+03, 1.67061166e+02], [0.00000000e+00, 0.00000000e+00, 1.00000000e+00]])
dist =
array([ 5.78695277e+01, -5.66734140e+03, 1.91833601e+00, 3.71670683e-01, -2.21831989e+02])という値になりました。