へっぽこ元ロボコニスト

ロボコンに燃え尽きた自分が日々の出来事を書くだけのブログです

2019/5/3(ArucoUnityでCharuco boardを作ってカメラのキャリブレーションデータを取得する)

明日はMaker Fair Kyoto

前回の記事です
mozyanari.hatenablog.com

環境が作れたので,キャリブレーションボード(Charuco board)を作りキャリブレーションをします

normanderwan.github.io

Assets/Scenesの中のCreateMakers.unityを開きます
自分が好きなキャリブレーション用のボードを作ることができますが,手間なのでデフォルトのまま作ります
なので,そのままUnityの実行ボタンを押します
f:id:masanari7430:20190503173345p:plain


すると,Assets/Imagesフォルダが生成されて,キャリブレーション用のCharuco boardが作れます
f:id:masanari7430:20190503173251p:plain
使うのは
ArUcoUnity_ChArUcoBoard_Dict4x4_50_X_7_Y_5_SquareSize_200_MarkerSize_120.png
です

これを印刷して厚紙に貼り付けます
f:id:masanari7430:20190503174612j:plain


normanderwan.github.io


Assets/Scenesの中のCalibrateCamera.unityを開きます
f:id:masanari7430:20190503174802p:plain

まず指定するのは使うカメラです
Aruco WebcamWebcam Idを設定します
自分はノートPC内蔵カメラが0番,以降接続したUSBカメラの順番に1番...と続きます
f:id:masanari7430:20190503174908p:plain

Mono Aruco Camera Displayのチェックボックスを消します
キャリブレーション実行時にこれが起動しないようにするためらしいです
f:id:masanari7430:20190503175233p:plain


次は,ArucoCharucoBoardのArucoCharucoBoardを設定します
f:id:masanari7430:20190503175903p:plain
変更すべき場所は,Maker Side LengthとSquare Side Lengthです
Maker Side Lengthはマーカの大きさを,Square Side LengthはQRコードの一つのマスの大きさをm単位で指定します
なので,自分が印刷したCharuco boardを定規で測って入力してください
f:id:masanari7430:20190503181503j:plain
(こうすることで,印刷機が勝手にCharuco boardを拡大したり縮小したりして印刷しても大丈夫になっています)


最後に,PinholeCameraCalibrationのAruco Camera Parameters Controllerを設定します
Camera Parameterに,「自分が好きな名前.xml」を入力してください
キャリブレーションデータの名前を決める部分です
リファレンスには空欄でも勝手に名前を作るよと書いてありますが,空欄だとエラーで書き出してくれませんでした
f:id:masanari7430:20190503181936p:plain

設定が終わったらUnityの実行ボタンを押すとキャリブレーションが始まります
カメラにボードを映して「add Image」を押すとキャリブレーション用のデータを取ることができます
様々な角度で撮ってください(自撮りをあんまりしないのでリア充ならうまいことやれるんだろうなと思いながらやっていました)
これを10回程度繰り返して「Calibrate」を押すとキャリブレーションが実行されます
結果は,Assets/StreamingAssetsの中にxml形式で出力されます
「Reset」ボタンを押すと最初から始めることができます
f:id:masanari7430:20190503182739p:plain
(OpenCVではQRコードなしのキャリブレーション用ボードを用意しますが,今回の方法はQRコードがついています.これによってキャリブレーションボード全体が写っていなくてもキャリブレーションを行うことが出来るようです.ただ,QRコード全体が写っているほうが精度はもちろんいいです)

Assets/StreamingAssetsの中のxmlデータを確認します
estimatePoseSingleMarkersで必要なものは,Camera Matrices Value=cameraMatrix,DistCoeffsValues=distCoeffsです
読み方はおそらく今回のデータだと
cameraMatrix=
|578・・, 0  ,319・・|
| 0  ,581..,259・・|
| 0 , 0 , 1 |

distCoeffs=[0.0772,-0.2668,-0.0023,0.0024,-0.1549]

だと思います
f:id:masanari7430:20190503184548p:plain

これでカメラのキャリブレーションデータを取得することが出来ました
次はこのデータを使って実際にQRコードを認識して距離を取得します