3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

OpenCVAdvent Calendar 2016

Day 14

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

Last updated at Posted at 2016-12-15

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

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

image

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

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

OpenCVのバグ(Pull Request)
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
 
という要望があり…

image

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

image

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

#即座にレスポンスがきた!
まず、めちゃくちゃびっくりしたのが、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してください(必死)

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

3
1
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?