<commit_before>やりたいこと

人＋台座の輪郭をベクターデータで書き出したい。（台座はソフト側で足す）
書き出したベクターデータはレーザーカッターに入力する想定

仕様

人の輪郭はKinectのdepthでとる
そのままだとギザギザでレーザーが遅いし出来上がりも汚いので、滑らかにする
腰に手を当てるとかしたときにできる穴もちゃんと輪郭をとる
台座はofRect的にちゃんと直角を出したい（人と一緒に平滑化しちゃダメ）
ベクターデータはPDFで書き出す（ほんとはSVGにしたいけど面倒そう……）

手順

Kinectからdepth画像を取得
上下左右奥行きでクリッピング
ContourFinderに突っ込んで輪郭抽出（ここで最大/最小面積でフィルタリング）
輪郭を平滑化
輪郭の内部を塗りつぶして描画
台座を同じ色で描画
再度ContourFinderに突っ込む（面積のクリッピングは不要）
検出された輪郭をPDF書き出し

使用addon

ofxNI2: oFでOpenNIを使うならコレだと思ってます。
ofxCv: oFでOpenCVを使うならコレだと思ってます。
ofxOpenCv: ofxCvを使うのに使用。あとofxCvがContourFinderでのHoleの検出が未サポートのようなのでそこでは使ってます。
ofxParamEdit: GUIでのリアルタイムパラメータ調整ならコレ。（自分のだけど……あと最近はofxUIも気になってます）
ofxGui: ofxParamEditを使うのに必要
ofxCairo: 今回初めて使用。PDF書き出しに使ってます。

ハマりポイント

ofxCvのバージョン
ofxCvがmasterブランチで早々と0.9.0対応を進めているのでコンパイル通らず困りました。
とはいえそこはさすがちゃんとしていて、0.8.4というtagがあったのでそれをcheckoutして解決。

ofxCvのContourFinderで検出された輪郭がHoleかどうかがわからない
ofxCvのContourFinderは、現状ではHoleかどうかの区別なく輪郭が検出されます。
たぶんHoleは頂点の順番が逆まわりなので、それを元に自前で判定する方向もありなんですが書く意欲がわかなかったので輪郭検出にはofxOpenCvのContourFinderを使うことにしました。

ofxCairoがstrokeを書き出してくれない？
輪郭が欲しかったのでnoFillしてstrokeだけのデータにしたかったけどそうすると空データが書き出されて困った。
それ以上のことは調べてません。<commit_msg>edited readme<commit_after>## やりたいこと

- 人＋台座の輪郭をベクターデータで書き出したい。（台座はソフト側で足す）
- 書き出したベクターデータはレーザーカッターに入力する想定

## 仕様

- 人の輪郭はKinectのdepthでとる
- そのままだとギザギザでレーザーが遅いし出来上がりも汚いので、滑らかにする
- 腰に手を当てるとかしたときにできる穴もちゃんと輪郭をとる
- 台座はofRect的にちゃんと直角を出したい（人と一緒に平滑化しちゃダメ）
- ベクターデータはPDFで書き出す（ほんとはSVGにしたいけど面倒そう……）

## 手順

- Kinectからdepth画像を取得
- 上下左右奥行きでクリッピング
- ContourFinderに突っ込んで輪郭抽出（ここで最大/最小面積でフィルタリング）
- 輪郭を平滑化
- 輪郭の内部を塗りつぶして描画
- 台座を同じ色で描画
- 再度ContourFinderに突っ込む（面積のクリッピングは不要）
- 検出された輪郭をPDF書き出し

## 使用addon

- ofxNI2: oFでOpenNIを使うならコレだと思ってます。
- ofxCv: oFでOpenCVを使うならコレだと思ってます。
- ofxOpenCv: ofxCvを使うのに使用。あとofxCvがContourFinderでのHoleの検出が未サポートのようなのでそこでは使ってます。
- ofxParamEdit: GUIでのリアルタイムパラメータ調整ならコレ。（自分のだけど……あと最近はofxUIも気になってます）
- ofxGui: ofxParamEditを使うのに必要
- ofxCairo: 今回初めて使用。PDF書き出しに使ってます。

## ポイント

- ofxNI2はdepth画像のdraw時に使うシェーダーを差し替えられるつくりになってて便利
上下左右奥行きのクリッピングはこのシェーダーでやってます。（NI.cppの Threshold::getShaderCode() const を参照）
シェーダーなので今回のようにその結果をOpenCVとかで処理したければ一度FBOに書く必要があるけど、ofPixelsをいじるよりは速い気がしてます。

- 輪郭の平滑化はofPolylineで、塗りつぶし描画はofPathでやってる
これは単純に関数が用意されているかどうかの問題なので別にポイントじゃないけど・・・。

- 台座を足す処理はFBOに書いちゃって改めて輪郭検出してる
ContourFinderを２度通すことになるので処理コスト的に無駄だけど、書き出し時にしか通んないしまあ良いかなって。。
パスデータの合成をまともに書くのが嫌だったのが主な理由です。

## ハマりポイント

- ofxCvのバージョン
ofxCvがmasterブランチで早々と0.9.0対応を進めているのでコンパイル通らず困りました。  
とはいえそこはさすがちゃんとしていて、0.8.4というtagがあったのでそれをcheckoutして解決。

- ofxCvのContourFinderで検出された輪郭がHoleかどうかがわからない
ofxCvのContourFinderは、現状ではHoleかどうかの区別なく輪郭が検出されます。  
たぶんHoleは頂点の順番が逆まわりなので、それを元に自前で判定する方向もありなんですが書く意欲がわかなかったので輪郭検出にはofxOpenCvのContourFinderを使うことにしました。

- ofxCairoがstrokeを書き出してくれない？
輪郭が欲しかったのでnoFillしてstrokeだけのデータにしたかったけどそうすると空データが書き出されて困った。  
それ以上のことは調べてません。
{'fraction_non_alphanumeric': 0.057412790697674417, 'fraction_numerical': 0.005813953488372093, 'mean_word_length': 12.974619289340101, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 3, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '7262149', 'n_tokens_mistral': 2426, 'n_tokens_neox': 2324, 'n_words': 95}