粗大メモ置き場

個人用,たまーに来訪者を意識する雑記メモ

にゃーんAAジェネレータ

にゃーん。

f:id:ossyaritoori:20170929174031p:plain

にゃ?

ーーーーーーーーーーーー                                          んん                      にんに      ーー
ーーーーーーーーーーーー      に  にゃににににに            にににゃゃゃにに    にににににににに  ーーーーー
ーーーーーーーーーーーー      にーゃ        ににゃににゃに    ー  にゃゃににに  ににゃに    にに  に    ーー
ーーーーーーーーーーーー      に  にに              にゃに  ん      ににゃゃに        にゃにゃにに      ーー
ーーーーーーーーーーーー        に  ゃ                    ににににに      に      にににににゃにに      ーー
ーーーーーーーーーーーーー        にゃに                  ににににに              ににににに  ゃ      ーーー
ーーーーーーーーーーーーーーー      にゃ                      に            ん          に      に        ー
ーーーーーーーーーーーーーー          にに                  ゃゃゃゃ                  ゃゃゃに    に      ー
ーーーーーーーーーーーーーーー      に          ん          ゃゃゃに                  ゃゃゃ      に      ー
ーーーーーーーーーーーーーーー      ゃ      ににんににに              ん    にゃゃゃゃに            に    ー
ーーーーーーーーーーーーーーーーーーにににににに    にににに                ゃゃゃゃゃゃ            に    ー
ーーーーーーーーーーーーーーー      ゃ  にゃゃゃんゃゃゃに                    にゃゃに          に  に    ー
ーーーーーーーーーーーーーーー      ににに                に                                    に  ー    ー
ーーーーーーーーーーーーーーー        に                          に      ゃゃゃゃに      ん      に      ー
                      ーーーー          に          ー              ににに        にににに      に        ー
                            ーー          にに                                              に          ーー
  に      ににに                ー        ににゃゃに              んん  ん          ににゃゃに          ーー
  に  ににににゃににに                  に        ににゃゃゃににににんににににゃゃゃにに      にに          
      ににににに  にに  に            に                にゃゃにににににゃゃ            に        にに      
                  ゃに    に          に                  ゃ          にゃゃゃににんににーに          に    
ーーー                に    ゃ      にーに              にゃ    ににゃに          ににゃに          ーに    
ーーーーーー            に    に    ゃ  にゃ              にににに                ゃに                ゃ    
ーーーーーーーー        ゃ    ゃ    に    にゃに                              にゃに              にゃ      
ーーーーーーーーーー    に    に    に        にゃに        ん          にゃゃにににににににににゃにゃーー  
ーーーーーーーーー        に    に  に            ににゃににににににゃにに                ん        ゃ    ー
ーーーーーーーーー        ゃ    に  ゃ                      にに                  ー                に    ー
ーーーーーーーーーー        に    にゃ                                  ーーーーーーーー          に      ー
ーーーーーーーーーー          にに  にににに      ーーーーーーーーーーーーーーーーー            に        ー
ーーーーーーーーーーー                にゃに      ーーーーーーーーーーーーーー                に          ー
ーーーーーーーーーーーーー                にー    ーー                                  ににゃに        ーー
ーーーーーーーーーーーーーーーー      ー  に      ー          に  ん        ににににゃゃに    に        ーー
ーーーーーーーーーーーーーーーーー          ー  ー        にに  んんんん      ゃに          ーーー      ーー
ーーーーーーーーーーーーーーーーー      に    ー        に                      にに          に      ーーー
ーーーーーーーーーーーーーーーーー        に        にに          ーーー            にに    に        ーーー


にゃ

にゃーん

ArduinoのPID制御ライブラリはどれがいいか

本来なら車輪の再発明はなるべく避けるべきと言いたいところですが
Arduinoのライブラリはちょっと挙動が特殊だったりするので自分で書いたほうが安全のような気もします.

見解まとめ

少なくとも公式のPIDライブラリはデフォルトの設定を一度見直して使うべきです。
アンチワインドアップがないのでI制御のゲインはなるべく落とすなど,ちょっとしたチューニングをいじる必要がありそうです.


発展的な事をしたい場合やリアルタイム性が気になる場合は「自分で書こう

というのが結論。

公式のPIDライブラリ

公式のページをどうぞ。
Classできちんと書かれており、見た目すっきりとした感じで書くことができます。
Arduino Playground - PIDLibrary

以下日本語で解説してくれている人もいますね。
ArduinoのPIDライブラリ - カラクリの館

中身について

Arduino-PID-Library/PID_v1.cpp at master · br3ttb/Arduino-PID-Library · GitHub

Compute関数の中をみると、まず前回との時間差分をとってサンプリング時間を超えているかどうか調べて,PIDゲインを更新。
うーん,,,うーん,,,,
追記:一周回ってまずまずなんじゃないかと思ってきました。


毎時更新されるわけじゃないので以下のようにif文を使ったほうが安全です。

  if(myPID.Compute()){//値が更新されたならTrueが帰る
     // 出力値の更新をここに書く
  }

計算自体は特に離散化するでもなく,連続系のままPID制御をしています。(安全っちゃ安全)

「初心者が比較的安全に動かせる」「ゲインをハンドチューニングする」ことを念頭において作られているようです.

不満

  • 一定周期で関数を実行してくれない。
  • サンプリング時間のデフォルトが200ms(遅すぎ)
  • デフォルトで負値の信号を生成しない(Limitがかけられている)
  • 出力制限はかけているのにアンチワインドアップが組み込まれていない。

デフォルトの設定が悪すぎるのが一番の問題。

モータ制御とかをしたいと思ったら200msの制御周期とワインドアップ,負値の出力不可の三連コンボでまず振動・発散します。
泣く泣くI制御を切る初心者の顔が浮かぶ(´・ω・`)

ArduPIDライブラリ

Gitに個人の作ったライブラリがあります。
GitHub - Tellicious/ArduPID-Library: A PID Library for Arduino digitalized with the Tustin's method with Anti-Windup

良いところ

  • きちんとTustin変換で離散化した制御器(離散化による不安定化とかいう負の側面もあるけど)
  • AntiWindupを2種類搭載

この上の2つだけで公式ライブラリより推したいところです。
プログラムの使い勝手としてはまぁまぁでしょうか。
サンプル時間をきちんと管理していない場合,AutoCompute()機能を使わないと少々変な挙動になったりするので要注意です。


あと,疑似微分の時定数もちゃんといじれたりと制御屋が作ったんだなぁと感じさせるライブラリ。

不満

  • 依然厳密なサンプル時間で実行しているわけではない。

- 私のコードにバグが残っている所(このライブラリは多分悪くない)

  • これが公式ではないという点(一番の問題点)

結論・再び

あまり良いものがないのできちんとしたものを書けば多方面から感謝されること請け合い。
(つべこべ言わずに自分で書いてはどうだろうか。)

余談:タイマ割り込みとシリアル通信の相性の悪さ

タイマ割り込みを実装しようとすると一部関数やピンが使えなくなるようです。
arduino使い方:タイマー割り込み(MsTimer2)

もっと問題なのはシリアル通信などを阻害するというケースがある点で,ROSのSubscriberとかと共存させるのにちょっと手の込んだ事をする必要がありそうですね。
Enabling timer overflow interrupt breaks rosserial - ROS Answers: Open Source Q&A Forum
arduino rosserial with interrupt - ROS Answers: Open Source Q&A Forum

解決法はもう少し暇で余裕のあるときに探します。

Arduino&MATLABでサーボモータ(とか)を制御する

ArduinoMATLABを連携すると要はコンパイルなしにいろいろデバッグができて作業効率が良いということです。
Pythonでもできそうなもんだけど誰か代わりに調べてください。

この30分のビデオ見ればここにあることは全部わかります。
Using Arduino with MATLAB and Simulink - Video - MATLAB

パッケージのインストール

matlab2014以降から対応です。

Support Package InstallerからArduinoに関する追加のパッケージをインストールします。
Home画面のAdd-onから探せるそうですが

matlabコンソールから試しに

a = arduino();

とか入力してみて出たエラーからも簡単に飛ぶことが出来ます。

あとはひたすらポチポチするだけです。大体15分弱かかります。

Arduinoとの接続と試運転

Control Servo Motors - MATLAB & Simulink Example
を参考に進めていきます。

接続

ホーム画面から「コンピュータの管理」というのを探し当ててそこからデバイスマネージャーのポートという所を探してください。
こんな感じ。
f:id:ossyaritoori:20170921065039p:plain

ここから得た情報を元に次のように入力してみます。
2つ目の変数はボードの種類なのでunoを使っている人はunoを入れてください。

a = arduino('com4', 'Mega2560', 'Libraries', 'Servo');

サーボモータの制御

サーボモータのピンを調べます。私のはモータシールドの「OUT5」につながっているので以下のドキュメントからD5とわかります。
Arduino Motor Shield Rev3

s = servo(a, 'D5')

s = 

  Servo のプロパティ:

                Pins: D5
    MinPulseDuration: 5.44e-04 (s)
    MaxPulseDuration: 2.40e-03 (s)

実際に遊んだ時のコードです。writePosition(s, angle);とcurrent_pos = readPosition(s);のようにして
位置の読み書きをします。
注意として0~180°が0~1に置き換わっているので180で割ったりしてください。

%% write value
Base_angle = 90;
Min_angle = -30;
Max_angle = 30;

for angle = Min_angle:10:Max_angle
    Wangle = (angle+Base_angle)/180;
    writePosition(s, Wangle);
    current_pos = readPosition(s);
    current_pos = current_pos*180;
    fprintf('Current motor position is %d degrees\n', current_pos);
    pause(1);
end
Wangle = (Base_angle)/180;
writePosition(s, Wangle);

他のmethodの確認

methods(a)

とうつことで使用できる関数を確認できます。

私のはこんなのでした。最新バージョンではボタン等のUIも書けるようです。とビデオにはあったんですがね。

addon                configurePin         display              readDigitalPin       servo                writePWMDutyCycle    
configureAnalogPin   details              i2cdev               readVoltage          spidev               writePWMVoltage      
configureDigitalPin  disp                 playTone             scanI2CBus           writeDigitalPin      

連続的に制御するには?

時間を取得するticとtocというコマンドを使ってwhileループぶん回すことで擬似的にそれっぽい制御をすることが可能になります。
あとはdelayを適宜入れれば遅い周期の動作は可能です。

Simukinkでもできます

Home->Addonからハードウェアパッケージのインストールを選択してAruduinoからsimulinkのパッケージを落とせばSimulinkでも開発ができます。
うーん、でもこちらは下のスライドにある通り、Simulinkで書いたプログラムをArduinoで実行するだけなので少々使い勝手は悪い感じがします。

f:id:ossyaritoori:20170922024235p:plain


DCモータの制御

本当はシステム同定をしたかったのですが手持ちの環境ではちょっと難し目です。あとで別に書きます。

特定の部品を使っている場合は簡単

Adafruit社のモーターシールドV2を使っている場合はとても簡単にDCモータを制御可能です。
裏を返すとそうでないと割りと面倒という...
Control Motors Using Adafruit Motor Shield V2 - MATLAB & Simulink Example

安いので楽をしたい人は買ってどうぞ。
Adafruit Motor/Stepper/Servo Shield for Arduino v2 Kit [v2.3] ID: 1438 - $19.95 : Adafruit Industries, Unique & fun DIY electronics and kits

私は持ってなくて悔しいのでこれについては書きません(公式のドキュメントが十分わかりやすい為でもある)

Neural Network Console by Sony のセットアップと動かしかた

2017年8月にSony機械学習用のGUIコンソールを発表して話題になりましたね。
手が早い人はもう記事を書いているようですが、晩御飯食べてる間に試してみたので記しておきます。
Neural Network ConsoleでNVIDIAGPUの動作確認まで - Qiita

ダウンロードとセットアップ

以下のサイトからダウンロード、解凍しておしまい。
Neural Network Console

というわけにも行かず、Visual C++の再領付パッケージを入れる必要があるようです。
Download Microsoft Visual C++ 2015 再頒布可能パッケージ Update 3 RC from Official Microsoft Download Center
これもダウンロードしてポチポチしておしまい。

つけて見ると見た目はこんな感じ

チュートリアル1:ロジスティック回帰による手書き文字認識


チュートリアルは手書き数字が4か9か判別する一層のニューラルネットワークモデルですね。

右上のTrainingという所で再生マークをクリックすると学習が始まります。
f:id:ossyaritoori:20170920111821p:plain
流石に早い。

その後Evaluateの下の再生マークから実行すると評価を始めます。
それぞれの入力に対する実際の出力の値、
f:id:ossyaritoori:20170920112142p:plain

タブを変えると学習の正答率を表す表が出てきます。
f:id:ossyaritoori:20170920112433p:plain


うんうん。なるほど。

所感、感想

Web上では敷居が低く、文系にも使いやすい等いろいろ書いてありましたが
Pythonを覚えなくてもいい」というのが一番の進歩でしょうか。

このコンソールで出てくるネットワーク構造をきちんと理解し、正しい使い方を自力で収集できる人は、
数ヶ月プラスすればPythonだって普通に使いこなしそうな気がするので
「とても便利」だけど「革命的」とまでは行かないと思われます。


これからこういう風に、学習法や幾つかのネットワーク構造が徐々に確立されつつある中で、
データセットや適切な問題設定の重要性が爆上がりしていくんですかね。
データ収集には結局プログラム書かないといけないのでプログラミングフリーの機械学習はまだまだ先でしょうか。

jupyter notebookをmatlabで使う / Google Driveにnotebookを保存

ポ○ットモンスター 金/銀 みたいなタイトルですが、iPythonのセットアップについてです。
難易度はそこそこある気がします。なみのり」を覚えてから来てください。

前提:Python環境

私の環境ではとりあえずWindowsでやるつもりでいます。
一連のパッケージ環境を整えるにはanacondaもしくはminicondaを使うのが良いでしょう。


あと、GitHubの一部コマンドが必要なので適当に調べて入れておきましょう。
例えばここを見るとか。
私家版 Git For Windowsのインストール手順 | OPC Diary

Anacondaを使う場合(簡単・ストレージを割りと食う)

Anacondaは一連のPython関連の便利パッケージを落としてくれるのでPythonに今後お世話になる気のある人はこちらを使いましょう。
デフォルトで2Gくらい容量持って行かれるので注意。

下の記事を参照。
ossyaritoori.hatenablog.com

画像関係に興味がある方はこちらの記事も踏んでおいたほうがいいですが、まぁ後からできるので無理にすることはないです。
ossyaritoori.hatenablog.com

Minicondaを使う(ストレージを沢山消費したくない人向け)

先ほどのAnacondaの機能絞った板がこちらです。
Miniconda — Conda
Pythonとcondaのパッケージ管理だけなので数百Mの容量で済むはず(試してない)

どのみちやることは同じです。

注意書き

jupyter in matlab
今のところmatlab2014b以降,対応するPythonのバージョンもmatlabのバージョンに依存するようです。

jupyter notebookをmatlabで使う

以下の参考サイトに準拠してすすめます。
Matlab-based IPython notebooks | Anne Urai
GitHub - Calysto/matlab_kernel: Jupyter Kernel for Matlab
Install MATLAB Engine API for Python - MATLAB & Simulink

0.Python(仮想) 環境構築

MatlabのバージョンごとにPythonの対応するバージョンが違います。

現状2015a,bでPython2.7系とPython3.3,3.4
現状2017bではじめてPython3.5がサポートされます。

これは
「C:\Program Files\MATLAB\R20XXa\extern\engines\python」にあるsetup.pyというファイルを覗けばわかります。

バージョンとか何も考えずに次に行きたい!という方はAnacondaのダウンロードの際に2.7を選択すると良いです。
ただ,今後継続してPythonを使う人は3.X系のほうが良いかもしれないです(バージョンごとに微妙に文法が違う)


次に仮想環境の構築についてです。
私の2015bの場合はPython3.4までが対応ですのでAnacondaの現在の3.6と噛み合いません。

ということで仮想環境を立てます。

conda create -n matlab python=3.4

次に,デフォルトではipythonが入っていないので

activate matlab
conda install jupyter notebook

とうちます。多分合ってると思うけどドチャクソ容量持って行かれますねこれ。
追跡したらAppdataの中を1Gくらい占拠していました。空き容量には余裕をもってください。


1.Matlab engineのインストール

anacondaから使いたい環境を選んでactivateしておいてください。(activateの単語に身に覚えのない人は気にせずanacondapromptを起動しましょう)
この際管理者権限でプログラムを実行したほうが良いです。

WindowsのHomeボタンで「AnacondaPrompt」とサーチして出てきたアイコンを右クリック&「管理者権限で実行」を選択しましょう。



以下を実行してください。2014以前のバージョンにはこのsetup.pyが含まれていません。中身書き換えて移せばなんとかなるんじゃね?なりませんでした。

cd "matlabroot\extern\engines\python"
python setup.py install

matlabbootはmatlabがおいてあるPathです。
頑張って探してください。参考までに私のは以下のような感じです。(なおバージョンが古くてなかった模様)
C:\Program Files\MATLAB\R2007b\
上手くいったら2へとすすんでください。


エラーが出たら?
  • Pythonのバージョン云々言われたら仮想環境の設定を確認してください。

きちんとactivate matlabってやって仮想環境入ってます?ダメなら先ほどの章を確認。

  • その後厄介なのが管理者権限が無いことでおきるエラー

以下のようなエラーが出る事があると思います。

error: could not create 'build': アクセスが拒否されました。

Error Installing MATLAB engine API for Python - MATLAB Answers - MATLAB Central

ということでコマンドプロンプトを管理者権限で実行してください。
setup.pyがあるフォルダまで移動して,次のようにうちます。

"C:\Users\__USER__\AppData\Local\conda\conda\envs\matlab\python.exe" setup.py install

めっちゃ長いのはさっきの仮想環境のPythonのFullPathです。
__USER__には自分のユーザ名を入れてください。というか一度ちゃんと探すと良いでしょう。

  • うまくいくとこんな感じ?

最後の行でエラーって出てなければ多分上手く行ってると思います。
f:id:ossyaritoori:20170921100639p:plainなんだこれは戦後の教科書か。

2.必要パッケージのインストール

その後、自分の環境で以下のコマンドをうってください。

pip install matlab_kernel
python -m matlab_kernel install

動作確認

一旦コンソールを落とすか、bash_profileを読み直して

jupyter notebook

と起動しましょう。

右上のNewをクリックしてmatlabが選択肢に出ればOK。
f:id:ossyaritoori:20170920062406p:plain

起動にやや時間がかかるもののこの通り。
f:id:ossyaritoori:20170921094510p:plain

トータルで4G近く容量を追加で消費したと思われるのでそこだけちょっと残念ですがこれは快適。
ぜひ使ってみてください。

jupyter notebook を GoogleDrive上で扱う。

GitHubでソース管理するのもいいけどGoogleDriveにもおいておきたい!という方のために、拡張プラグインが開発されています。
github.com
日本語記事もこちらに。
jupyter-driveを使ってみる

インストール

これだけ。

git clone https://github.com/jupyter/jupyter-drive.git
pip install -e jupyter-drive

起動

複数やり方はありますが、以下のように設定するのがおすすめ。

python -m jupyterdrive --mixed

下のような画面になりました。
f:id:ossyaritoori:20170920055534p:plain

localをクリックするとlocalのフォルダへ、gdriveを選択するとGoogleDriveへのアクセス許可を求められます。



Matlabが古いけど無理やりでもこの機能を試したい!

結論上手く行ってませんので諦めて新しいバージョンのmatlabに課金してください。

以上が「通常の手法」です。
matlabpython,ipythonのバージョンが合わなかったりするととたんに闇のゲームへと突入します。
ちょっと調べただけでもうげぇとなるようなケースがちらほら。
anaconda3-4.2.0 (Python3.5.2) 環境で Jupyter Notebook 上で MATLAB R2017a API の使用ができないのはなぜですか? - MATLAB Answers - MATLAB Central

matlab live editorという逃げの1手

わりかし似たような事ができるものとしてLive editorというものがあるようですが...
www.mathworks.com
これで勘弁してくれないですかね。

さぁ、闇のゲームだ!

f:id:ossyaritoori:20170920081158p:plain
例えば強制的にengine以下のフォルダを持ってきてpythonスクリプトを修正して発動してしまうのはどうでしょう?

只今奮闘中...

追記:敗北しました。古いmatlabのバージョンでは騙せなさそう...
f:id:ossyaritoori:20170920073844p:plain

さらに追記:
setup.pyをいじってバージョン違いでもエラーを出さないように加工してもやはり最後に以下のようなエラーが出ます。
諦メロン
f:id:ossyaritoori:20170923153125p:plain

第二ラウンドだ!

Jupyter: Matlab Kernel Dies · Issue #22 · Calysto/matlab_kernel · GitHub
以下のコマンドを導入...

pip install metakernel
pip install pymatbridge

追記:敗北しました。ていうかどこかしこを探しても無理って言ってますね。公式に楯突くのはやめておきましょう。

f:id:ossyaritoori:20170920081313p:plain

Windows Python 環境おさらい 2017年9月編

メモ記事のメモというやつです。ポインタへのポインタ的な。
WindowsUbuntuの環境がごっちゃになってきたので。

tf35環境とAnacondaの用法等

現在はanacondaでtf35と名付けた仮想環境を使ってパッケージ管理しています。

activate tf35

で起動。deactivateで環境を脱出。

基本的なパッケージのインストールはこちら。
ossyaritoori.hatenablog.com

エディタやパッケージの追加についてはこちらを参照。
ossyaritoori.hatenablog.com
ossyaritoori.hatenablog.com

iPythonについて

そういえばあまり書いてこなかったiPythonについても。

エディットしたいフォルダに行って

jupyter notebook

と打てばブラウザ上で画面が表示されます。右上のnewからPython3を選択して新規notebookを作成。
未だに使い勝手を測りかねています。

以下の記事が図付きでよいです。
はじめるJupyter Notebook - Qiita


GitHubについて

この時点ではまだGUI版をよく使います。

このサイトを見て時々コンソールから試す程度。
www.atmarkit.co.jp

余談ですがGitのシェルはコマンドプロンプトより幾分優秀です。デフォルトにしたいくらい。

OpenCV Python でHDR画像を合成してみよう

趣味全開です。趣味と実益とごっちゃになってきてます。
良いんだか悪いんだか。

Google PhotoのHDRレンダリング

Google PhotoにはHDRレンダリング機能があります。
feb29.org

つまりこんなかんじのこと。
f:id:ossyaritoori:20170918165509p:plain

これスマホの写真でやりたい!という記事になります。

追記:iPhoneを始め多くのカメラにはHDR機能が搭載されているそうな。知りませんでした…。
しかし以前手ブレの問題はあるのでかろうじて意義はあります。

以下説明

通常カメラが取る画像には明るさの幅に限界があって(ダイナミックレンジといいます)明るい所と暗い所を同時にきれいにとれないという問題が有ります。
結果、人間が見てきれいだと思う風景もカメラで取るとなんだか物足りない、ということになります。

そこで暗い画像と明るい画像を合成して人間が見た風景に近づけるのがこのHDRという技術です。

残念ながらGooglePhotoでは現状はスマホで取った画像ではHDR合成をしてくれないようです。
OpenCVにはHDR合成のサンプルコードがあるのでこれをうまく使って合成を試みてみようという試みになります。
OpenCV: High Dynamic Range (HDR)

レッツゴー!

1.手ぶれ補正

手で取るので必ずしも同じ画像とは限りませんね。このブレをなんとか補正したいです。
手ブレを微小回転と仮定し、SIFT特徴点を用いて回転を補正するコードを書けばいいんでなかろうか。

この論文とかそれっぽい。
A study on the compensation of image rotation for optical three-dimensional microscope - IEEE Conference Publication

追記1

OpenCV3ではSIFTが使えないのでAKAZEを使いました。
また,画像の変形はとりあえずホモグラフィー変換を用いましたがきちんとした式を建てると解くのが大変そうです。
これってちょっとした技術誌書けるんではないだろうか?

オプティカルフローからワープを推定してうまいこと処理する必要がありそうですがアイデアとしては既にどこかがやっているかと思われます。

追記2

訂正。並進要素のない微小回転とホモグラフィーワープは計算してみたら等価でした。

image stabilization(手ぶれ補正)で調べると結構関連記事が出てきます。
matlabの情報は古くAffineワープを使っていますが
Video Stabilization Using Point Feature Matching - MATLAB & Simulink
IEEEにもそれっぽい記事があります。うーん流石にちゃんと研究されていますね笑。
Video stabilization using classification-based homography estimation for consumer video camera - IEEE Conference Publication

ソース?

対応点から微小回転の射影変換行列を求めるmファイル。
三軸回転と焦点距離に関して式がでるので本当は4変数ですが線形方程式で解きたかったので5変数で解きます。ホモグラフィーの9変数より変数が少ないのでノイズには多少強いはず。ニッチなプログラムだなぁ。

function H = solveHomo_2(pts1,pts2)
%	H is 3*3, H*[pts1(:,i);1] ~ [pts2(:,i);1], H(3,3) = 1
%	the solving method see "projective-Seitz-UWCSE.ppt"

n = size(pts1,2);
x1 = pts1(1,:)';
x2 = pts2(1,:)';
y1 = pts1(2,:)';
y2 = pts2(2,:)';
zero = zeros(n,1);
one = ones(n,1);

A = [zero,-one, y1, x2.*y1, -x2.*x1, x2-x1;
    one, zero, -x1, y2.*y1, -y2.*x1, y2-y1];

%[evec,fuga] = eig(A'*A);
[U W V] = svd(A);
evec = V(:,6);

evec = evec/evec(end);
H = [1 -evec(3) evec(2); evec(3) 1 -evec(1); -evec(5) evec(4) 1];

end


でもよく考えたら中心点がわからないから正規化もできないし、その分も未知変数にすると結局8変数を推定することになるので普通に射影変換を求めれば良いという結論になりうる…

2.レンダリング

これはOpenCVのソースみれば書けそうな気がします。あとで書く。
OpenCV: High Dynamic Range (HDR)

やるよ。

追記1

よくみたら露光時間とかいう要素がありました。
なるほど携帯のカメラではまだそこまでやってくれませんね。

ゆくゆくは輝度値からうまく推定すべきでしょうが割りと適当でもそれなりにうまくいくようです。

やってみた

元画像はこちら。

暗い画像

明るい画像

どうしても空などと一緒に撮るとこういうことになっちゃいます。

位置ズレ補正

三脚ではなく手で連写するのでそのまま重ねると位置があわずに死にます。

ダブるでしょ。これを補正したいわけです。

AKAZEのマッチング結果と補正結果
f:id:ossyaritoori:20170918163755p:plain
遅くて今まで使ってなかったけど結構出来るやつですね。
重いので小さい画像で勘弁。

ちょっと回転とかが補正された後です。
f:id:ossyaritoori:20170918163807p:plain
わりと綺麗に補正されていますがより複雑なシーンだとホモグラフィーワープでは綺麗にいかないでしょう。
追記:極端な近景やカメラの並進がない限りはホモグラフィーで平気そうです。

重ねた結果

なんか複数手法があるらしく,よくわからないけど一番それっぽいのを一個見せます。


波とか動く部分があると粗はでますがわりと綺麗になったのではないでしょうか。

なるほど,意外といろいろ気を遣う部分があって製品?として公開してくれないというのはそういうことなのかなぁと思いました。

コード

現在修正中。来週の休みにでもGitにあげておきます。

今のところこんな感じ。
github.com

改善点

  • ワープ推定の数式の改良。
  • 露光時間比推定アルゴリズム実装
  • 色鮮やかにするフィルタの適用

がメインの課題でしょうか。3つ目はおまけですが。