HOMEWORKS2020に参加しました。

もう2ヶ月近く前の話ですが、、、
1月23日24日と大阪のPINE BLOOKLYNというイベントスペースで、
HOMEWORKSという展示のイベントに参加させていただきました。

その中で私は drawingBlobscapes という作品を展示させていただきました。

drawingBlobscapes

20210124_1324.gif

画像まとめ(flickr)
20200123-24_HOMEWORKS

コロナ禍ということもあり、中には東京からリモートで展示される作家さんもいらっしゃいましたが、私は帰省も兼ねて厳重にコロナ対策を行った上で現地にて参加させていただきました。

ちなみに大阪移動で新幹線のグリーン車に初めて乗ったのですが、普段乗っているものと結構違って少し衝撃でした。広くてすげー快適、人もわりかし少なかった。

経緯

HOMEWORKSについて以前から名前は知っていて、参加してみたいなあと思っていた展示でした。たまたま会社の同僚から紹介いただいて、いい機会だったので、ぜひにと参加させていただきました。

当初はVRゴーグルに使われるような高密解像度モニタを使って、
一見写真や絵画に見える展示物の中で一部映像が表示されているという作品を作ろうと考えていたのですが、
VRモニタとPCの相性が割と限られていたようで、予定していたPCではモニタに映像が正しく表示されないという自体が発覚し、展示内容を再検討しました。VRモニタはPC選んで別の機会に使ってみたい。

なにか使えそうなアイデアないかなと過去のプロジェクトなど見ていると、ちょうど1年前にopenFrameworksで作成していた実験プロジェクトを発掘し、自分としては改めて好きな表現だなーと思ったので、こちらを作品として仕上げてみることにしました。

作品について、

概要的な話をすると、
openFrameworksを始めてからkyndさんというアーティストを知り、プログラミングで作るアナログな表現に魅力を感じていました。

作っていく過程で、
抽象的に変換された自分の像を見ることで、自分にしかそれは自分だとわからない表現が面白いなと思ったり、
自分は写真に映るのが少し苦手なので、こういう曖昧な像の残り方は好都合だと思いました。

ちょっと余談ですが、記憶を探るには小石程度のきっかけで良いとパクノダが言ってました。
実際には、記憶は形を留めないけれど。美化され風化されるものだけれど。
個人的に思い出すということに関しては、別に正確でなくても十分に意味は果たしている、
むしろ正確に思い出すことはそこまで重要でなく、美化され風化され、
都合よく形を変えた方が思い出すということは豊かな気がします。

手書きのようなイラストチックな表現を目指した結果、いままでなんとなく好きだった表現に少し理由が見えてきた気がしました。

同じ絵でも、他人にはわからないけど、自分にとってはなんとなく理解できるものは、愛着を持ちやすいと思います。自分にだけの度合いが強ければなおさら。
また一見なんの手がかりにもならない写真や映像が、ある人にとっては、何かを思い出すきっかけになればいいなと思っていました。エモ。

イラストチックにするだけであれば、映像をアニメ調に変換するとか、鉛筆画風に変換するとか、シェーダーや機械学習を使った手法がたくさんあります。

それも悪かあないのですが、別の手法をとった場合、何かしらの制限によって別の手法が必要になった場合、自ずと差別化された新しい表現が生まれるものかもしれないです。
まあ今回の話では時間や自分の能力などの制限が仕方なく発生している部分もありますが。
だからこそ、このプロトタイプとしてゆるく展示できる場所には大きな意味があるとも感じました。


技術的な話をすると、
主な技術としてはopenCVのfindContours , k-meansというものが使われています。

撮影した映像の1フレームを対象にk-meansの処理を掛けることで、その1枚で使われている主な色を抜き出します。

K-meansとは、ものすごくざっくりと説明すると、複数ある値を指定したK個のクラスに分類する手法です。普通、平均を出すと、複数の値から1つの平均値を取り出しますが、それが複数個取り出せるみたいな。(今回は10個とか)
以下の図でいうと、XYにたくさんプロットされている点を3つのクラスタに分類すると、各点はどの分類に当てはまるか、またその主となるXYは(薄い大きな+OX)どんな値か。みたいな。
そして、取り出した色をもとにfindContoursという処理をあてます。

kmeans

findContoursについてもざっくり説明すると、1枚の画像から輪郭を検出するような処理です。
ピクセルごとに周りのピクセルと比較して明るさに大きなギャップがあるピクセルを輪郭のエッジとするみたいな。
で今回は、色を指定してこのfindContoursをかけ、指定した色の輪郭を検出するということをしています。

こうして検出された輪郭はいくつかの点の情報を持っています。この点をつないで輪郭線を書くわけなんですが、このときこの点の数を間引いていくことで抽象的な表現にしています。要は多角形を三角形に近づけていくみたいな話。
図形に近づけることで少しおしゃれな見え方になったりしてたのしい。gifでみると変化が見られたりしてたのしい。

でまた、この輪郭のことをContourとかBlobと呼ぶことをよく見かけます。
この輪郭・塊の集合で表された像を描いていく作品だったので、タイトルをdrawingBlobscapesとしました。

ちなみに本作はopenFrameworksを使用して制作したのですが、
K-meansは内部的にはピクセルに対して行われる処理ではあるので割と重たい処理です。なので、この処理は別スレッドで処理するようにしています。
来場者の中にopenCVに詳しい方、openFrameworksを触っていた方もいらしていて、まさにスレッドなど自分としては少し頑張った部分について質問していただいた方がいて嬉しかったです。

その他、今回はほぼshaderを使っていないので、今後のブラッシュアップもいろいろできるかなと思ったり。ただ、使わなかったからこその表現であった気もします。

おおまかな作り自体は1年前の元プロジェクトの時点でできていたものの、
展示用に最適化であったり、パラメータの調整的なところであったり、
簡易でマッピングの機能もいるわと思って、ofxWarpMeshで対応したり。

あとWebカメラの映像をそのままこの変換に掛けるのでなく、彩度やコントラストの調整は事前にWebCamSettingというアプリを使って処理しました。
その調整くらいならプロジェクトに仕込んでもよかったけど、ギリギリまで別の所を詰めるべきだと思ったので、そこは既存のアプリをありがたく使おうと割り切りました。こういう展示なら十分。

感想

思っていたよりもお客さんが来てくれていて、だけど会場が広くて込み過ぎもせず、とてもいいイベントに参加させていただきました。
めちゃくちゃ良いスペースだったのですが、もう営業終了してしまうということで非常に残念。

リアルな展示ではお客さんから直接感想やフィードバックを貰えるので、やった実感があって楽しかったです。

展示しながら人がいないタイミングでパラメータいじってみたり、gifでも出力しておきたいなと思って、急遽1分毎くらいに3秒分くらいを連番で書き出す機能を実装してみたり。個人的にはライブ感のある展示で退屈しなかったです。これもゆるめの展示だからこそ。

プロジェクターを割と大きなスペースにドンと投影するのは久しぶりだったので、やっぱりそれだけで少し嬉しかったです。
コロナが落ち着いてきているので、また少しずつこういうイベントが増えて参加できるといいなあ。

ご来場いただいたお客さん、企画運営などしてくださった方々、参加作家のみなさま、お疲れさまでした&ありがとうございました!!

20210124_1422.gif
20210124_1326.gif

oF_ofxARKitでPeopleOcclusion

openFrameworksでPeopleOcclusionを実装する際の手順を記載します。

こちらにソースコードおいてます。以下はその解説などになります。
https://github.com/shiyuugohirao/oF_PeopleOcclusion_example

はじめに

PeopleOcclusionというのはAppleが開発したARKitに備わっている機能です。
2次元の画像から人と認識される部分を取得できます。

ちゃんと着手するまで勘違いしていましたが、
PeopleOcclusionはあくまで2次元の処理であり、深度を取得したり推定したりする機能ではありません。

逆に言えば人間部分の推定に深度情報を必要としないので、
ディスプレイ・モニタに写った人や平面ポスターに印刷された人なんかでも認識は可能です。
(実際の人間に比べると精度は劣るような印象ですが。)

ちなみにPeopleOcclusionと呼んだり、PersonSegmentationと呼んだり、ほぼ同義のワードが飛び交うようです。

またちなみに、Unityでは、Unityが公式で開発しているらしいARFoundationというARKitをまとめたSDK(?)があって、そこから比較的容易に取得できます。
以前、北千住デザインさんのQiitaの記事を参考にしたら、いとも簡単に動かせたので驚きでした。

で、Unityでは調べりゃたくさん記事が出てくるのですが、openFrameworksではたぶんほぼ参考文献がありませんでした。
ZachLibermanさんのInstagramなどでは、ちらほらPeopleOcclusionらしき作例がアップされていたので、あきらめずに試行錯誤できました。

環境

手順

まずは、ofxARKitのサンプルを動かしてみます。
他のアドオンと違いちょいと設定が必要なので、ofxARKitを触ったことない方は、慣れるためにも、適当なサンプルをいくつか実機で実行してみることをおすすめします。
(たとえばexample-basicとかexample-face-trackingとか)

ProjectGeneratorを使ってプロジェクトファイルを作る際には、2bbbさんの記事もとても参考になります。

ofxARKitを使う際の設定項目は大きく4つ。

  • Targetの設定 ()
  • Signing&Capabilitiesの設定
  • ofxiOS-Info.plist でカメラ許可の設定
  • Shaders.metal の設定

以下その詳細な手順

  1. ProjectGenerator > import で適当なサンプルフォルダを選択し、 Updateでプロジェクトファイル(.xcodeproj)を生成します。

  2. 生成したxcodeprojを開きます。

  3. 左のProjectNavigatorからプロジェクト名を選択して、[General]タブからDeploymentInfo > TargetをiOS13以上にします。
    ※PeopleOcclusionなどiOS13以上でないと使えない機能を使う場合、Targetの設定もiOS13以上を設定しておかないとたしか警告が出てうぜえです。


  4. 続いて[Signing&Capabilities]タブでAppleDevelopperLicenseの設定を行います。
    ※ここについての詳細はいろいろとややこしいので、別の記事を参考にしてください。

  5. ProjectNavigatorから ofxiOS-Info.plistを開き、右クリック>AddRow>Privacy - Camera Usage Description を追加します。
    ※Valueをサボって空欄にしているとアプリ起動時にコンソールに以下のようなエラーが出てました。

    [access] This app has crashed because it attempted to access privacy-sensitive data without a usage description.  The app's Info.plist must contain an NSCameraUsageDescription key with a string value explaining to the user how the app uses this data.
    




  6. ProjectNavigatorから addons > ofxARKit > src > lib > Shaders.metal を開き、右側Inspectorsから Typeを MetalShaderSource、TargetMembershipにチェックを入れます。




その他注意点として、ProjectGeneratorで新規プロジェクトを作ったら、以下フォルダのsrcファイルも必要になります。

  • delegates
    • MyAppDelegate.h
    • MyAppDelegate.mm
  • viewcontrollers
    • MyAppViewController.h
    • MyAppViewController.mm
    • OFAppViewController.h
    • OFAppViewController.mm

基本はexampleのsrcフォルダにある各フォルダをコピペでいいと思います。僕は特に弄ったことはなかったと思います。

上記の手順を踏めば、実機でサンプルは問題なく動くはずです。
ビルド成功しても、起動直後に落ちる場合は、カメラの設定など怪しいです。
コンソールのエラーを見ると割とちゃんとエラー内容が書いてあるので、参考にしてみてください。

上記手順はProjectGeneratorでプロジェクトをUpdateするたびに必要になります。
なんてこともofxARKitのREADMEに書いてありました。丁寧だぜ。

PeopleOcclusionの実装

本題です。

要点は、

  • ARKitからSegmentationBufferを取得する。
  • 取得したSegmentationBufferを頑張って使いやす型に変換する。
    →今回はcv::Matに変換する方法を見つけたのでcv::Matを採用しました。

ARKitでは人物か否かをSegmentBufferというバッファに格納するようです。
ここまでできれば、openFrameworksで如何様に処理が可能です。

注意点として、取得できるSegmentationBufferは 256x192pxしかありません。
iPhoneXSの場合、取得したカメラ画像の解像度は 1125x2436pxなので、SegmentationBufferをマスクとしてカメラ画像を切り取るには調整が必要です。
cv::Matでは座標の向きも普段と異なったり。。

また、SegmentationBufferをスケールだけ合わせてマスクとして利用すると、もとが低解像度のためエッジがかくかくしてしまいます。
このためof_PeopleOcclusion_exampleではブラーをかけてエッジをなめらかにしてみたり、
ofxCv::ContourFinderで輪郭(Blob)を取得してみたり、工夫が必要になります。

ARKitからSegmentationBufferを取得する

oF_PeopleOcclusion_example をもとに説明していきます。

サンプルアプリの動作を説明をしておくと、

  • 取得したカメラ画像の描画
  • SegmentationBufferをもとに取得した輪郭線の描画
  • SegmentationBufferをもとに取得したステンシルバッファ(白黒マスク画像)の描画
  • ステンシルバッファでマスクしたカメラ画像(セグメンテーションされた画像)の描画

の4つをそれぞれ、画面左上、右上、左下、右下のタップでオンオフ切り替えるものです。



sessionの開始

ARKitを利用するためexample-basicなどと同様、まずofAppのコンストラクタでARKitのセッションを開始します。

このsession開始時に合わせて、どんなsessionを開始するのかを記述したconfigurationを設定します。
※これはexample-face-trackingのサンプルを参考にしました。

ofApp :: ofApp (ARSession * session){
    ARWorldTrackingConfiguration *configuration = [ARWorldTrackingConfiguration new];
    auto mode = ARFrameSemanticPersonSegmentationWithDepth;
    bool b = [ARWorldTrackingConfiguration supportsFrameSemantics:mode];
    if(b) configuration.frameSemantics = mode;
    else ofLogWarning()<<"Not support for "<<mode;
    [session runWithConfiguration:configuration];
    this->session = session;
}

ARWorldTrackingConfigurationの他にもARBodyTrackingConfigurationなど面白そうな設定もあるのですが、
今回のPeopleOcclusionについては、ARWorldTrackingConfigurationなど一部のタイプでしか利用できなかったはず(Apple公式リファレンスにそんな記述があったようななかったような)

用意したconfigurationに対してframeSemanticsというものを追加で設定してやります。
これもPeopleOcclusionをする際は、ARFrameSemanticPersonSegmentationARFrameSemanticPersonSegmentationWithDepthなどを指定する必要があります。(Apple公式リファレンス)

以上で、ofApp起動後にセッションが開始され、setup()のなかから、このセッションを引数としてprocessorを生成します。

    processor = ARProcessor::create(session);
    processor->setup();

で、このprocessorをupdate()することで情報を更新し、sessionから様々な情報を取得することができるようになります。

cvtSegmentationToPix()

update()から呼んでいるもので、ここで、要点となるsegmentationBufferの取得と変換を行っています。

auto buf = session.currentFrame.segmentationBuffer;

ここがポイントです。
ちなみにサンプルでは推論型を使っていますが、CVPixelBufferRefとなります。(公式リファレンス)

さらにちなみにここでsegmentationBufferではなく、estimatedDepthDataを取得すればおそらく2次元画像からデプス推定したバッファを取得できるはず、、!

取得した CVPixelBufferRef をcv::Matに変換します。
参考 : https://stackoverflow.com/questions/19358686/how-do-i-convert-from-a-cvpixelbufferref-to-an-opencv-cvmat/43465531

cv::Mat ofApp::getMatFromImageBuffer(CVImageBufferRef buffer) {
    cv::Mat mat ;
    CVPixelBufferLockBaseAddress(buffer, 0);
    void *address = CVPixelBufferGetBaseAddress(buffer);
    int width = (int) CVPixelBufferGetWidth(buffer);
    int height = (int) CVPixelBufferGetHeight(buffer);
    mat = cv::Mat(height, width, CV_8UC4, address, 0);
    //ofxCv::convertColor(mat, mat, CV_BGRA2BGR);
    //cv::cvtColor(mat, mat, CV_BGRA2RGBA);
    CVPixelBufferUnlockBaseAddress(buffer, 0);
    return mat;
}

ここまでで、openFrameworksでPeopleOcclusion(SegmentationBuffer)を取得することができました。

ここから先は、取得したデータをどう処理するかという話になります。
cv::Matの描画やマスクなどの処理については後日また改めて、書きたいと思います。

study:

openCV3/4のメモ

openCV3/4のメモ

要約

openCv4をopenframeworksで使うまでの手順。
プロジェクトの生成については、ほかサイトで見なかった簡単な方法をメモ。
めちゃ雑記です。

概要

oFでopenCV3とか4とか使ってみます。
この記事この記事にそって進めてみる。
opencv4でないといけないことは特にないです。ただただBackgroundSubtractorを試してみたかった。
後日また雑な記事かきます。テストの動画だけ貼っときます。なにかのための証拠。

環境とりあえずMac

openCVのinstall

まずはopenCV3 or 4のインストール。
※ 基本最新で上書きされるっぽい。3,4を共存させる方法もあるらしいが、自分は openCv4.1.0でこれといって不具合はないので、opencv4のみになっています。

brew tap homebrew/scienceは使えなくなったらしい。参考
そのため brew tap brewsci/science こちらのコマンドで環境アップデート。

  • opencv3の場合
    brew install openCV3で入れる。
  • opencv4の場合
    opencv4についてはこちらが詳しい。
    brew upgrade opencv でopenCV4(最新版 ex: 4.1.0)を入れる。
途中xcodeのコマンドラインをインストールしてね的なエラーが出たので、xcode-select --installをして、再度upgradeかけると、エラーなく無事完了した。  
過去に入れた気がするのにと思っていたけど、どうもOSをアップグレードすると再度入れる必要があるらしい。  

普通にすすめると、たいていは/usr/local/Cellar/opencv/が更新されるはず。

Xcodeで新規プロジェクト作成

色んなサイトでは以下の方法があげられていたが、パス間違える可能性があったり、記入が面倒だったりなので、個人的にはおすすめじゃない。

紹介されていたプロジェクト生成方法

open
  1. Project.xcconfigでOPENCV_PATHを設定 パスは適宜変えてください。
//OpenCV3
OPENCV_PATH = /usr/local/Cellar/opencv/3.4.1_2
//OpenCV4
OPENCV_PATH = /usr/local/Cellar/opencv/4.1.0_2  
  1. BuildSettingsのHeader Search PathsにOpenCVのインクルードパスを追加
    $(OPENCV_PATH)/include/opencv4
  2. Build SettingsのOther Linker Flagsに必要なdlybを追加
    ここが面倒、、

openCV4をインストールすると、libフォルダにdylib以外に.aファイルもありました。
これらおそらく中身は同じですが、動的ライブラリか、静的ライブラリかの違いがあります。  
こちらでは動的のほうがファイルサイズ小さく、使用メモリも少なくできるっぽい。
dylibを追加するのが面倒な場合は、
.aファイルをGeneralのLinked Frameworks and Librariesにドラッグドロップしても起動可能です。

(たぶんProject.xcconfigのOTHER_LDFLAGSこのあたりの設定でどうにかなるのだけど、、)

#include <opencv2/core.hpp>ここでリンク貼れてないよってエラー出たけど、単純にheader search pathに$(OPENCV_PATH)/includeを入れてないのが原因でした。

おすすめの生成方法

ProjectGeneratorでプロジェクトを作り、

  1. プロジェクトのSearchPaths > HeaderSearchPathsに/usr/local/Cellar/opencv/4.1.0_2/include/opencv4 を追加。(パスは適宜変更してください。)
  2. /usr/local/Cellar/opencv/4.1.0_2/libから必要なdylibを General>LinkedFrameworks and Libraries にドラッグドロップで追加

どのヘッダ呼び出すときにどのlibが必要になるのか、どこを見ればいいんだろう。。。今の所勘で追加しています。。。
このやり方が簡単安定な気がする。Debug/Releaseで変更の必要ない?
紹介されていたプロジェクト生成方法だと必要かもだけど。


画像は適当に追加したのでごちゃっとしています。どうやら.aの静的ライブラリよりは、.dylibなど動的ライブラリのほうが実行ファイルが軽く、メモリの消費を抑えられるとかどうとか。。。

ofxCvとの連携と利用

oFでopenCVを扱う際に、関数群を使いやすくまとめてくれているofxCvを使うとめっちゃ便利。

ProjectGeneratorでofxCvのみ追加してプロジェクト生成。
あとは、上の1.2.を同様に。
なんかもしかしたら、もうちょうっと設定必要だったかも。わすれてもうた。


おまけめも

ofxOpenCvDnnSegmentation など

やはりどこにでも先人がいるもので、馬場先生のofxOpenCvDnnSegmentationがあった。openCVのdnnライブラリをいろいろまとめてらっしゃる。

配布されていたopencv2.aでうまくいかなかったので、自分でメイクしてみる。参考

が、原因はどうもそこではなかった。ので、makeの手順は隠す。

makeの手順
  1. python build_framework.py osxを実行するが、python3ではうまくいかないみたい。
    自分の場合は python2 build_framework.py osc とするとうまくいった。
    python -Vでバージョンを確認したり、which python, which python2でpythonの2.7以上が使われているか確認するとよさそう。
    参考1 参考2

エラー(returned non-zero exit status 65)について
** BUILD FAILED **

The following build commands failed:
    CompileC /Users/hiraoshugo/openCV/opencv-4.1.0/platforms/osx/osx/build/build-x86_64-macosx/modules/world/OpenCV.build/Release/opencv_world.build/Objects-normal/x86_64/opencl_kernels_video.o /Users/hiraoshugo/openCV/opencv-4.1.0/platforms/osx/osx/build/build-x86_64-macosx/modules/world/opencl_kernels_video.cpp normal x86_64 c++ com.apple.compilers.llvm.clang.1_0.compiler
(1 failure)
============================================================
ERROR: Command '['xcodebuild', 'MACOSX_DEPLOYMENT_TARGET=10.12', 'ARCHS=x86_64', '-sdk', 'macosx', '-configuration', 'Release', '-parallelizeTargets', '-jobs', '4', '-target', 'ALL_BUILD', 'build']' returned non-zero exit status 65

こんなエラーでた。どうやらcmakeのバージョン(3.10.2)がダメらしい。参考
てわけで、cmakeのupgrade

cmake --version
// cmake version 3.10.2
brew upgrade cmake
// .....
cmake --version
// cmake version 3.15.2
python2 build_framework.py osx
// .....

  1. python build_framework.py –contrib <opencv_contribへのパス> osx

そんなこんな。。

結論、こちらのように#include "opencv2/imgproc/imgproc_c.h"をofxCvのWrappers.hに追加した。

modelデータは以下から直接落とした。
http://dl.caffe.berkeleyvision.org/fcn8s-heavy-pascal.caffemodel


最近いろんな出会いがあって楽しい。特に音楽やってる人とよく出会う。
春よりも春らしい。

明日は学生CGコンテスト25周年のパーティーにいってきます。
夏がもうすぐ終わるからね。季節の変わり目。春の訪れ。
秋はいずこへ。

openframeworksでカメラが使えなくなった

openframeworksでカメラが使えなくなった。
ofAVFoundationGrabber.mmの
[self.captureSession addInput:captureInput];
でエラーが出る。
QuickTimeなどではちゃんとカメラが動作するので、oFかXcodeの設定かなと踏んでいた。

open

結論としては、Macのシステム環境設定でセキュリティとプライバシーのカメラの設定で、oFのアプリのチェックが外れていた。
何がきっかけで外れたのか、何を思ったか昔の私がチェック外したのか。。

エラー内容は以下みたいな。

An uncaught exception was raised
~~
Terminating app due to uncaught exception &#039;NSInvalidArgumentException&#039;
~~
libc++abi.dylib: terminating with uncaught exception of type NSException

ちょっと話は違うけど、以下を読んで、ふとプライバシーの設定のことを思い出した。
https://github.com/openframeworks/openFrameworks/issues/6193

コンソールのエラーログにもセキュリティ的な話がなく、
再起動しても、新しくoFの環境作ってVidoGrabberExampleをビルドしても、同様のエラーが出ていたので、悩みました。
気づいてみれば簡単なことなのに、、残念な経験は案外忘れているんですね。


iOSアプリの設定で変数など管理

iOSアプリを作ったときに、
アプリを入れたあとで、コンテンツの中身を書き換えたい場合。

たとえば、
OSCを使うためIPアドレスをアプリに設定したい。
アプリの向きを変えたい。
デバッグモードのトグルで切り替えたい。
などなど。

上みたいな設定ができると、作ったアプリにちょっと愛着わいてモチベ上がる。

サイネージのお仕事でiPadなどの端末からコンテンツを操作するということが
最近ふえたので、そのときにしておくと親切なTipsです。

openFrameworksでiOSを開発する際にはofxSettingsが便利でした。
https://github.com/prossel/ofxSettings

 


詳細な設定は文末の参考リンクにまるなげ。

設定の大体の流れは、
1. srcなど右クリックでSettings.bundleファイルを追加する。
2. Root.plistに表示したい項目を追加。
3. Keyの値を利用して、端末の設定画面で入力した値をアプリ起動時などに変数へ格納する。(ofxSettingsではSettings::get~()で取得)
4. 取得はせず設定画面に表示したいだけの場合はKeyの値を利用してSettings::set~()で。
5. ビルド時の情報を表示させたい場合は、BuildPhases

 

APP_VERSION=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" $PRODUCT_SETTINGS_PATH)
/usr/libexec/PlistBuddy -c "Set :PreferenceSpecifiers:9:DefaultValue ${APP_VERSION}" "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/Settings.bundle/Root.plist"

date=$(date "+ @ %Y.%m.%d %H:%M")
BUILD_NUMBER=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" $PRODUCT_SETTINGS_PATH)$date
/usr/libexec/PlistBuddy -c "Set :PreferenceSpecifiers:10:DefaultValue ${BUILD_NUMBER}" "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/Settings.bundle/Root.plist"

RunScriptで上のような記述をします。
1行目:APP_VERSIONという変数にxcodeで指定しているアプリのバージョンを代入
2行目:plistのitem9DefaultValueをAPP_VERSIONに書き換え
みたいな感じでしょうか。
何項目め、みたいな指定しかできないのかな。ちょっと調べてみたけどなさそう?

xcodeからAddRowとかして追加するとなんか表示変になっていたりすることがあるので、plistファイルを他のエディタで開いてxmlとして直接編集した方が無難かも。
xcodeで編集できる方がitemのナンバーとかわかりやすいけど。

'date=$(date "+ @ %Y.%m.%d %H:%M")' などを追加して
ビルド時の日時なども記載しておくとデバッグなどでは便利かも
http://goozenlab.com/blog/2015/02/06/versionning/


参考
https://dev.classmethod.jp/smartphone/iphone/settings-bundle-acknowledgements/
https://qiita.com/akatsuki174/items/392cb3be619fabfa4608