2016-10-08

GitHub Repository: https://github.com/mct-procon/procon2016/tree/ProductionVersion

全国高等専門学校プログラミングコンテスト2016 競技部門に参加しました. 三重県伊勢市で開催され,1回戦敗退でした.(人力部門なのにコンピュータで頑張って解こうとしたので当たり前だよなぁ?)

ルール概要

多角形パズル(物理)を渡されます.

Puzzle Piece
Puzzle Piece
Puzzle Frame
Puzzle Frame

これを読み取ってパソコンで解きます.

Solving Puzzle
Solving Puzzle
Solving with error
Solving Puzzle with Error

コンポーネント全体

パズルをスキャナで読み取り,ベクタ化するスキャナ(Scanner, SonnaPuzzle.exe)と実際にパズルを解くソルバ(Solver, PuzzleSolver.vs2015.exe)に分かれます. スキャナは私が,ソルバはチームメンバの川上さんが担当しました.

スキャナ

First Step
First Step
Choosing Step
Choosing Step
Binalize Step
Binalize Step
Detection Step
Detection Step(a bit old version)
Detection Step
Detection Step(very old version)
OpenCVの関数を使いまくります.
  1. HSVで2値化します.(自分でコードを書いているっぽいです.)
  2. OpenCVのFindContours関数を用いて,境界を抽出します.
  3. OpenCVのApproxPolyDP関数を用いて,ベクトル化します.

新しい物好きでSIMD(System.Numerics.Vector)使ってるよこいつ… カスケード検出器使って,図形のタグ付けもしようとしていましたが,遅すぎでしたね… パノラマ機能も使っていません.

ルールで,頂点はすべて5mm×5mmの方眼上に配置される,みたいなのがあれば,ApproxPolyDPよりも精度の高い検出方法を考えよう!みたいことができたと思うんですけどね…

.Net Framework 4.6, WPF, Emgu.OpenCV 3.0(OpenCLやっほい)を用いました.あと,カメラの画像も取得できますが,使った記憶がありません.

ソルバ

私が開発したわけではない(川上さん担当)ので,ざっと説明しますが,「結合度」による,「ビームサーチ」を行います. 結合度は,次の要因により増加します.

  • 辺の一致
  • 角が180度になる
  • 角が360度になる
../images/procon2016/connectivity.png

Connectivity

これは,人の組み方を真似しています.

Microsoft Visual C++ 2015, DxLibを用いました.

(実行画面は最初の方に出しています.)

乾燥した感想

1位のチームがコンピュータ使っているのかは知りませんが,使っていなかったらたまげてそう. 皆さんの人力アピール,徹夜アピールが面白かったです. ソルバの開発が遅くて,バスの中で仕様変更に対応するためにコード書いてた思い出があります. というか,高専入って早々,なんで一人で1コンポーネント担当しなきゃいけないんですかね…

Related Links