津山高専:ぱずとく!
第27回高専プロコン ※masterブランチはきたないので見ないほうがいいですanother-algorithmブランチをオススメします(アルゴリズムGUIへの敷き詰めで終わっていますが
本戦では完成していなくて使えませんでしたが少しでも技術てきなアプローチになれば嬉しく思います。
あとはサーチャーが完成すればまともに動くところまでは作っています。
今のところは使い方の説明というよりは, 作品の紹介のみとさせていただきます。
開発環境
- Visual Studio 2015 update3
- opencv -v3.1
ファイル構造
/opencv
- メインプロジェクト
Main.cpp
- メイン
Operator.h, .cpp
- 画像の外部ファイルの読み込み
- アルゴリズム(できてない)やGUIの管理
PieceManager.h, .cpp
- Piece1つ1つを管理
- vectorで管理
- Pieceは全部ポインタで管理(std::shared_ptr
Piece.h, .cpp
うまく動かない場合には画像がうまく2値化できていないor不要な影などが入っている可能性が高いです。
- ピース一つのデータ(頂点, 角度, 辺の長さ)を管理。
- コンストラクタで画像をあたえることでデータを作成できる。
GUI.h, .cpp
- Pieceのデータから線で描画する。
- Opencvの既存である図形を塗りつぶしてくれる関数ではうまく動かなかったため
Frame.h, .cpp
- フレーム(ピースからの継承
Common.h
- インクルードや名前空間の管理
頂点の検出方法
今回は製作時間をあまり割けなかったので, レンズのずれの補正などはしていません。
頂点, 角度, 辺の中で最も検出が難しいのが頂点だった。ほかはその頂点を元にもとめた。
- 図形の輪郭を検出(vectorかなんかで管理
- 輪郭を近似
以上(テスト時は割と精度が良かった。32角形に対応できる自身はない。
Piece.cpp-71~
//情報量を拡大
cv::findContours(src, contours, CV_RETR_LIST, CV_CHAIN_APPROX_NONE);
//輪郭を直線近似する
cv::approxPolyDP(contours[0], approx, 0.01 * cv::arcLength(contours[0], true), true);
いろいろ試した末に2行にまとまった。
サーチャー
作ってない(少なくとも私は
当事者たちが書いてはいたみたいだが完成はしていない
当事者たちにやる気があるのであれば, このプロジェクトに少しずつ更新されていくと思います。
GUI描画ようにsejimhpがすごく簡単に書いたものが少しはありますが