今回はOpenCV+AruCoを利用する前準備として、使用するウェブカメラのキャリブレーションを行います。

  1. import cv2
  2. import matplotlib.pyplot as plt
  3. import numpy as np

  4. square_size = 2 #印刷した人ます分の長さ
  5. pattern_size = (7, 7)

  6. reference_img = 50

  7. pattern_points = np.zeros( (np.prod(pattern_size), 3), np.float32 )
  8. pattern_points[:,:2] = np.indices(pattern_size).T.reshape(-1, 2)
  9. pattern_points *= square_size
  10. objpoints = []
  11. imgpoints = []

  12. capture = cv2.VideoCapture(0)

  13. while len(objpoints) < reference_img:
  14.     
  15.     ret, img = capture.read()
  16.     height = img.shape[0]
  17.     width = img.shape[1]

  18.     gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

  19.     ret, corner = cv2.findChessboardCorners(gray, pattern_size)
  20.     
  21.     if ret == True:
  22.         display("detected coner!")
  23.         display(str(len(objpoints)+1) + "/" + str(reference_img))
  24.         term = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_COUNT, 30, 0.1)
  25.         cv2.cornerSubPix(gray, corner, (5,5), (-1,-1), term)
  26.         imgpoints.append(corner.reshape(-1, 2))
  27.         objpoints.append(pattern_points)

  28.     cv2.imshow('image', img)
  29.     
  30.     if cv2.waitKey(100) & 0xFF == ord('q'):
  31.         break

  32. display("calculating camera parameter...")
  33. ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None)

  34. np.save("mtx", mtx)
  35. np.save("dist", dist.ravel())

  36. capture.release()
  37. cv2.destroyAllWindows()

 詳しいことは省きますが、このプログラムを実行すると
'detected coner!'
'1/50'
というようにチェス盤すべてが画面内に入っているときに画像の読み込みが始まっていき、
"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])
という値になりました。


ches