2018年5月23日水曜日

デザイナにはデータを構造化して渡そう

イベントのスケジュール欄とかの印刷物を作っていると、後から後から修正が来て結局修正漏れになったりする事って多いですよね。ということで西院フェス(音楽フェス)のパンフ作成でやって上手く行ったワークフローの紹介です。
 イメージ的にこんなやつです。このミュージシャンが変更になった、バンド名に「.」が抜けていたとかいう連絡さ五月雨式にやってきます。

ステップ1:情報を一カ所に集める

西院フェスの場合は、Webで全てを管理してますが、いきなりハードル高いデスよね。Google docなんかでエクセルを共有するだけでも良いかと思います。
エクセルでやるならばvlookupなどを使って、スケジュール一覧にバンドIDいれれば、そこから各種データを切り出せるよ!っていうセルマクロが要るとは思います。

ただし全員がそのデータを見て「便利」と思わないと積極的に更新してくれません。各自の連絡をうけて一人で更新すると気が滅入るので、各ブッキング担当・会場担当が自分で更新してくれる空気作りに数年かかりますが、できちゃうと超楽です。
西院フェスでは以下のように一カ所のデータを多面的に使う事で、全員がソコに有るデータが原本という風に認識しています。

  1. ブッキング担当の音源選考用データベース(音源が貼り付けてあって聴ける)
  2. Webに載せる用のライブスケジュール(自動で連動)
  3. パンフ/ポスター担当がスケジュール及び、ミュージシャン/会場一覧覧をGET
  4. 出演時間の交渉のための各会場担当用の連絡先一覧
  5. PA番長が会場ごとに機材仕込むための要望機材一覧表
  6. PAマンが会場で使う出演順のセッティング図一覧
ちなみに、西院フェスでは以下のようにJSONでスケジュール一覧をGETできるサービスを持っているので、ソレをつかってパンフ担当は仕事をします。

https://saifes.net/joinA/artist_json.php?e=2017spring

ステップ2:データを流し込む

データをイラレのスクリプトを使って流し込みます。文字列がはみ出たりするけれども、どうせフォント縮小でいくのか、改行でいくのかパンフ担当が拘りたいところなので、何もせずはみ出たまま流し込みます。
この時流し込む座標はスケージュール時間と、テンプレートとなるイラレファイルから計算して座標を求めています。なので既に作ったスケジュール枠の上にレイヤーを重ねれば左上の絶対位置は正しいという風になります。


ステップ3:差分を自動生成する 

流し込みができたので完成と思いがちですが、字詰めも終わったぞ〜〜って時に変更依頼がきたりします。ここでゼロから流し込みするわけにはいきません。
ということで、差分情報を元に変更一覧を作ってあげます。この変更一覧は上の流し込みにつかったjsonを流し込みした日付を付与して保存しておくことで解決です。その流し込みからの差分をしりたいので、二つのjsonをひかくするだけでOKです。diffsche.pyという専用のプログラムで差分があったスケジュールだけを出してくれるので、そこだけ修正漏れがないかを確認すればOKです。
会場担当がバンド名やジャンルを修正して、それをパンフ担当に伝えてなかったって事がよくあるのですが、そういう伝達漏れの心配はこれでなくなります。


そして、デザイナの作業も変わります。五月雨式に対応するのではなく、デザイナが作業するタイミングで差分データの作成をデータ提供者に要求するのです。確認工数が減るとともに、工数が読みやすくなります。


参考

ソースコードはここに置きました。以上の事を発注者側が全部やるのは無理にしても、こういう管理ができるように、せめて、デザイナには一貫されたフォーマットで矛盾のないデータを作って渡してあげましょうね。
https://bitbucket.org/akira_you/saifes_nagasikomi

 

2018年3月15日木曜日

pyenv環境のpythonににOpenCV3.4.1を入れる

ubuntu/pyenv/python3.6.4の環境で、OpenCV3.4.1をインストールする時のメモです。
OpenCVのインストールについて調べるとsystemのpythonに入れる方法がたくさんでてきて
pyenvで最新のpython試したいぜ!な人向けの解説って少ないですよね。


pythonインストール

pythonのインストール時にはlibpythonを作ってもらうために、enable-sharedオプションが必要です。ということで、以下のようにpythonを再インストールする必要があります。

ONFIGURE_OPTS="--enable-shared" pyenv install 3.6.4

(注:readlineが足りねぇよ。等の警告がでたら素直に追加インストールしましょう。)

OpenCVダウンロード

以下URLからソースコードをダウンロードします。(gitで最新追い駆けたい人はgit cloneで)

https://github.com/opencv/opencv/releases
https://github.com/opencv/opencv_contrib/releases

解答すると、opencv-3.4.1とopencv_contrib-3.4.1 ディレクトリができてるはずです。

依存パッケージインストール

OpenCVのサイトを参考に以下をインストール。

sudo apt install build-essential
sudo apt install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev

 

インストール

pyenvのインストールディレクトリは、以下のようになってるはずなので「pyenv which python
」等として調べてください。でとりあえずPROOT環境変数にいれています(書きやすくするため)

export PROOT=~/.pyenv/versions/3.6.4

buildディレクトリを作ってcmakeを走らせます。インストール先はPROOTします(root権限不要)。
注意事項としてはPYTHON3_LIBRARIESを設定する事と、PYTHON2やJAVAを無効にしておくこと。そうしないと、python3のみにインストールとする事で、すべてのライブラリをroot権限なしでインストールできるようになります。 

cd opencv-3.4.1/
mkdir build
cd build



 cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-3.4.1/modules/ -D BUILD_opencv_python3=ON  -D CMAKE_INSTALL_PREFIX=$PROOT -D PYTHON3_LIBRARIES=$PROOT/lib/libpython3.6m.so -D BUILD_opencv_python2=OFF -D BUILD_JAVA=OFF  ..

注:cmakeをやり直す時はCMakeCache.txtを削除してからcmakeやりおします。
 ここでPython3の項目に「NO」がないことを確認します。



あとはmakeを実行してインストール。

make -j
make install


インストールされてる事の確認は、pythonを起動してimport cv2をすればおk

あと、ROSを使ってる人等は環境変数PYTHONPATHが設定されてたりします。
そっちにpython2.7用のOpenCVが入ってるのでそっちが参照されてしまいます。
unset PYTHONPATHしましょう。





2018年2月7日水曜日

VuforiaのVuMarkでのビット(Element)数について

VurMarkを使おうと思ったけど、会社ではイラレ無い。でも、サンプルのSVGみてXML編集すれば、普通にマーカ作れるじゃん!そこまではいいんだけど、マーカのビット(Element)数を計算するのにイラレがやっぱり必要という落ちで、年休の暇を見ておうちのマシンで検証してみた。
https://library.vuforia.com/articles/Training/VuMark-Design-Guide

結論としてはかなり変わっている。例えば文字列9文字入れるのと10文字入れるので大きくビット数が変わるのでデザインに気を遣うので要注意です。

Stringの場合

 エクセル風にかけば「=7*[文字数] + 7*MAX(MIN(20,INT(( [文字数] -10)/10)*2+4),4)」でエレメント数が得られます。若干9以下と100ちょうどに気持ち悪い処理が入ってる感じがするけどとりあえずmax,minで対応してます。

Binaryの場合

 Stringが7bitなのに対して8bitになっただけかと思いきや、maxの所の引数が違うので注意です。
「 =8*[byte数] +8* MAX(MIN(16,INT((F2-10)/10)*2+4),4)」

byteにしても文字列にしても、20以上では10単位余計なおまけコードが追加されるので20文字ちょうどや!ってなった時は頑張って19文字に押さえるとドット数を減らせます。逆に19文字で白黒の偏りが大きくて気持ち悪いなって時はダミーで1文字足せば白黒の偏りが減ります。

Numericの場合

 規則性が謎でした。
 2^2(=4)以下では必要ビット数+16
2^3(=8)以上では必要ビット数+25
2^19(=1048576)以上では必要ビット数+31
2^50(=1125899906842620)でいったん必要ビット数+30になるけど
2^51で必要ビット数+31に戻ったので・・・・怪しい領域です。

最大値は2^49以下で使うのが無難でしょう

ちなみに以下のように<g id="VuMark-Description">の中に書くのだけれども、IDlengthはダミーで、MaxIDはGUIでの設定値の+1の値をMaxIDに入れるようです。なので編集途中のイラレやSVGにはいってるMaxIDと登録する時のSVGのmaxIDは違いマス。
    <g id="VuMark:test_original"></g>
    <g id="IDtype:numeric"></g>
    <g id="IDlength:1"></g>
    <g id="MaxID:32"></g>
    <g id="Elements:29"></g>

参考まで、サンプルをのsvgをできるだけシンプルにしたmaxID=32のnumericマーカーの例です。
https://gist.github.com/akirayou/32d4e8ae7a666a54f18f7e5d408af475


補足

elementのIDは重要です、ちゃんと桁数まで合わせて連番である必要があります。グループ化されてると1要素としてカウントされるらしいですが・・・細かい所は自信ありません。
 中身が空っぽのグループもないとfailします。(DOMに各要素があることを前提としてアクセスしてるみたい?)
 cleaSpaceだとかボーダーからエレメントまでの隙間など最大辺比5%はあけとけとの事です。
あと、各elementの最小サイズは最大片比で3%です。

2018年1月12日金曜日

アイディアメモ: Hololens等でARマーカを安定に併用したい

従来技術と課題

hololensにVuforiaを組み合わせてARマーカとhololensの空間認識を併用する事自体は行われている。ARマーカが空間認識カメラからみて十分小さい場合、すなわち空間に置かれるような場合は問題はない。しかしモノクロ印刷されたARマーカを手持ちした場合、空間認識のにも影響を与える為にARマーカが手ぶれで移動する際に空間認識にノイズとしてのり画面が揺れる等の弊害がおきる。
ARマーカの例

 Hololensの癖(仮説)

上述の問題は液晶モニタの画面をhololensごしに眺めている場合にはおきない、これは空間認識用のモノクロカメラが赤外光を重視し、可視光による特徴点を空間情報として用いていないため(と推察される)。

対策案

この性質を利用して、スマホ画面に表示されたARマーカを見る事は容易に考えられ、実際に行われている。しかし軽量化のためには印刷されたARマーカを用いる必要がある。

対策案1

https://www.an.shimadzu.co.jp/apl/food/e8o1ci00000003pr.htmにあるように黄色・赤色の着色料は赤〜赤外領域で吸収をもたないものが多い。赤〜赤外に吸収をもたないオレンジ色の着色によってARマーカを印字すれば空間認識側に影響をあたえる特徴点量は大きく減らせると考えられる。具体的には赤102号、黄4号などの着色料を用いる。
この表現では全体に青色が抜けたマーカを用いる事ができる。

対策案2

対策案1とは逆にARマーカの上から赤〜赤外に強い吸収をもつ塗料もしくは光学フィルタをかける。この表現では全体的に青色をかけた色になる。

今後

対策案1はすぐにでも試せるので、試してみる。対策案2はスペクトル一覧みながら身近な物質を探してみる。青色色素でも近赤外に吸光ないのは多いので。


追記:会社の居室ではガタガタふるえまくるほど起きる現象なのに、家の環境だと、たまにひっぱられるぐらいだなぁ。ぐらいにしか再現しない・・・。  かなりニッチな現象らしく、家での再現に時間かかりそう・・。