OpenCVのcontribにモジュールを追加してPRしてみた

#はじめに
これは、OpenCV Advent Calendar 2016 10日目の記事の続き、をもったいないので、14日代行で上げておきます。

OpenCVのfreetypeモジュールを、contribとして追加申請した感じの話になります。

![image](https://qiita-image-store.s3.amazonaws.com/0/89434/759fd69a-d169-15cb-0d81-6b886b69393f.png)

ただし、基本的には感想文なので、得るものは少ないかもしれません。ただし、「新しいモジュール作ったる！！」って人がPR送る前に、一度でも参考にしていただければ幸いに存じます。

#後悔先に立たず…（2016/12/15 23:24JST追記)
コメント欄に記載していただいた記事ですが、もし、先にこちらをきちんと読み込んでからPRしていたら、この悲しい記事は生まれなかった/半分くらいの修正になっていた、かもしれません。PRしてやるぜって方はまずは下記を是非ご覧ください。

[OpenCVのバグ(Pull Request)](http://tessy.org/wiki/index.php?OpenCV%A4%CE%A5%D0%A5%B0%28Pull%20Request%29)
http://opencv.org/contribute.html
https://github.com/opencv/opencv/wiki/How_to_contribute
https://github.com/opencv/opencv/wiki/Coding_Style_Guide

#なんでPRしたのか
![image](https://qiita-image-store.s3.amazonaws.com/0/89434/35ec7ca3-6695-9209-bf48-4b21f1535b55.png)
　
という要望があり…

![image](https://qiita-image-store.s3.amazonaws.com/0/89434/2325ee48-8099-c315-9243-386cc4d63d3f.png)

という要望がリプライできまして

![image](https://qiita-image-store.s3.amazonaws.com/0/89434/c970d3b5-471e-f4e9-7a4c-6ebb7d7e5d5e.png)

と、やっちゃいました！！

#即座にレスポンスがきた！
まず、めちゃくちゃびっくりしたのが、commit直後にレスポンスがものすごく早かったことですね。
もしfreetype対応必要だって中の人も考えていた・・・としたらうれしい限りですね（勝手な妄想）。

10:35 commit
10:47 最初の指摘

#レビューでは、どんな指摘があったのか？
いくつかカテゴライズしてみましょう。

## 単純ミス
- PKG_CONFIG無い環境への配慮が足りていない
- もうSphinxなんて使ってないから、RSTなんて要らない
- descriptionが古いままだよ
- cv::Matはインスタンスで抱え込まないで、参照にしましょうね。

## え？そんなルールがあったの・・・？
- namespaceでindentなんてしないよ
- precomp.cpp？要らないよ…

## あれ？そういえば・・・
- interfaceとimplementは分けてね
- モジュール使えないときは、ocv_module_disable(freetype)してね

## その他指摘以外で直したもの
- そもそもヘッダの位置がおかしくてコンパイルできないよ
- whilespaceが行末にあるよ！（docのコンパイルで引っかかる）
- pythonのwrapper作るときに、unsigned intはダメ（ライブラリのコンパイルで引っかかる）
- CV_Assert()で保護やってなかった（自主リテイク）

#何が問題だったのか？
##1 他モジュールの書き方をまねた→そっち自体が問題だった
"namespaceでindentなんてしないよ"とか、"precomp.cpp"とか、別モジュールの書き方をそのままマネていました。
でもダメーってことで直さざるを得ませんでした。

##2 行末のwhitespaceチェックしなければならないことに気が付かなかった。
前部のソースコードの行末は、スペース入っているとNGになります！！
っていうのがDoxygen実行のbuild botで警告されて初めて知りました。
おおお、そういう話が合ったのですね・・・

##3 Pythonのwrapper作るときに、unsigned intがおかしくなる
これは原因がわからなかったのですが、挙動を見て頭を悩ませた結果、

unsigned int でエラー。
→ 他関数のintのところは問題起きない。
→ もしかし、unsigned は Python Wrapper対象になるが、intは対象外になっている？
→ 試しに、intにしてみる。
→ 問題なくなる（いろいろ不思議）

##4 ビルド環境と自分の環境で、ライブラリバージョンが違ってた！

最初は、"freetype/***.h"という形でcommitしたが、通らない。

```
  #include <ft2build.h>
  #include <freetype/freetype.h>
  #include <freetype/outline.h>
```
ログを見ると、そんなパス/ファイルはないよー、と言われてしまう。でもこれでいいはずなんだけどなー。
バージョン違うんかなー、などと、頭を悩めてfreetypeのマニュアルをよーく読んだら、

```
 #include <ft2build.h>
 #include FT_FREETYPE_H
 #include FT_OUTLINE_H
```
という形で書くべきだったと。ただ、ビルド環境に入っているのと同じバージョンが手元になくて確認できなかったのが辛かった…

#まとめ（と反省点）
わけわからないまま、ほかのモジュールをパクると、大変な事になる、が今回の教訓でございました。

## commitは計画的に
「自分の裏環境のバックアップにも、git便利だなー」ってちょこちょこcommitしてたら、ゴミcommitが消せなくなって、泣きながら再度ブランチ作り直しからやり直すはめになりました。特に、大本の（github上の）コードとマージしちゃうとダメです！！

自分の修正　→　githubのコードをfetch → 自分の新たな修正

こうなるともうどうしようもなくなる。

## これから先、やらなきゃいけないこと。
testやsampleの実装充実などを図って、来年中にはマスターへのマージができるといいなあ、というのを夢見て生きていきます。
M+ Projectのフォントあたりを使って・・・ですかね。

あと、Linuxは対応したけど、WindowsやらMacやらでも対応した方がいいんですかね？
pkg-config 使わずにharfbuzzのライブラリ位置を探索するしかないですね。
webkitのfindHardbuzz.cmakeパクってしまうのが一番楽ですが…

## module開発者向けにOpenCVの中の人に要望する事
「このテンプレにそってやれば、モジュール作れるよ！」っていうサンプルモジュールを、contribにcommitしておくと、みんな幸せになってどんどんモジュールが増えるのかも！！誰かPRしてください（必死）

以上、よろしくお願いいたします。