Monthly Archives: October 2015

Ffmpegで一枚の画像を静止動画に変換する

動画を作るときに、高機能なソフトがあれば困らないでしょうが、無ければ、ffmpegは有効な物になります。ここで、ffmpegを使って、一枚の画像を静止動画に変換する方法を紹介します。極めて簡単です。

全部の引数が必要なわけではありませんが、設定しないと一緒にしてほしい動画と合成できない場合があります。 簡単に紹介してみますと、 -loop 1 で一枚で繰り返すと指定する。 -c:v h264 で画像のエンコード方を指定する。 -c:a mp2 で音声のエンコード方を指定する。 -t 30:00.000 で三十分の長さを指定する。 -vf scale=800:640 で出力動画の寸法を指定する。 -pix_fmt yuv420p で出力動画の画素フォーマットを指定する。 -r 29.98 でFPS数を指定する。   ちなみに、二本の動画をつなげたい場合は動画生成のパラメータが違ったりしますと、エラーが出る可能性があります。例えば、先頭の一本がちゃんと入って、二本目が入らないなど。   参考:ffmpeg Documentation https://ffmpeg.org/ffmpeg.html

Bash で同一シグナルに複数のトラップを設定する方法

背景 Bashスクリプトにトラップを設定することができます。トラップとは、シグナルに対して反応するコマンドの事です。Bashでは一般に下記の方法でスクリプトにトラップを設定します。

(注:同一のtrapに複数のシグナルを同時に指定することもできます。) このトラップコマンドに本当にトラップ(罠)が仕掛けられています。例えば、この様な場面があります。一時ファイルを何回も作成し、スクリプトが終了する時に一切削除をしたい、では、下記のやり方をしてみましょう。

これがダメなんです。削除されるのは「$TMPFILE3」のみです。原因は、trapを実行する度に現在のフラップコマンドを上書きしてしまいます。簡単な解決法としては、下記のような書き方をすることはできます。

しかし、プログラムが大きくなれば、いつ、どこで設定するかを把握しにくくなります。なので更なる改良が必要です。 解決策 (multitrap) 解決策は下記のようなプログラムを使用するか、類似の方法を使用することになるかと思います。

上記のコードをあなたのスクリプトの先頭部分に置いて、以降はすべての「trap」を「multitrap」に書き換えれば解決です。 使用例:

出力結果:

 

ウェブページや画像の存在性をcURLで速くチェックする(PHP)

ユーザーに情報を提供したい場合は、できれば、存在している物のみを提示したい場合があります。考えて見てください。リンクが沢山はられているとしても、大部分のリンクは使用できないのであれば、ユーザーはこのページが使えないと思い二度と来なくなるかもしれません。画像を表示する場合は、NoPhotoや割れアイコンなどを表示したく無いですね。JavaScriptで判定するのは一つの方法ですが、時に旧バージョンのソフトをカバーするなどの原因でできません。この場合は、cURLは高速な解決法を提供してくれます。 curl_multi_* のような関数を使用します。以下に定型的な例があります。

詳細な関数説明は http://php.net/manual/ja/ref.curl.php にあります。 以下は例を持って説明します。

 

微分法によるオプティカルフローを試してみました。

画像の中の物体が移動すると、一定の方向に沿って移動します。この方向と距離を示すベクトルはいわゆるオプティカルフロー(Optical Flow)です。この方向の検出は大変複雑の過程であり、これを簡単化するために、二つの前提条件が設けられました。一つは、移動前と移動後、移動された点の明るさは変わらないことです。一つは、近い点のグループはほぼ同一な移動をします。 \( P(t)_{x,y} \)を時点\(t\)の画像\(P\)の、\((x,y)\)座標にある点の明るさとします。分析のため、\(P\)を可微分に考えます。そうすると、\( P \)は\( \mathbb{R}^3 \to \mathbb{R} \)の関数になります。テイラー式で\(P\)を展開してみます。 (式1): \[ P(t+\delta t)_{x+\delta x,y+\delta y}=P(t)_{x,y} + \delta x \frac{\partial P}{\partial x}+\delta y \frac{\partial P}{\partial y} + \delta t \frac{\partial P}{\partial t} + \zeta \] このうち、\( \zeta \)は高次剰余なので、引数の変化が小さい場合のみを考慮しますので、\( \zeta \)を無視します。ここで、一つ目の前提仮設を使います。つまり:\( P(t+\delta t)_{x+\delta x,y+\delta y}=P(t)_{x,y} \)、これを(式1)に代入しますと、 \( 0=\delta x \frac{\partial P}{\partial x}+\delta… Read more »

Scale Spaceを学んでみました。

      No Comments on Scale Spaceを学んでみました。

画像を解析する場合において差分法は良くしようされます。差分法は簡単ですが、ノイズに影響され易いです。結局に要るか要らないか、沢山の特徴候補が出てきます。これを軽減するため、ガウススムージングはよく使用されます。しかし、単なるガウススムージングでは、ノイズの軽減には有効ですが、あまり消せません。いわば、更なる一層のスムージングが必要になります。 Scale Spaceは実際に一種のスムージングとして考えられます。一枚の画像のサイズを段々に小さくして行きます。大きい画像は下の層に置かれ、小さい画像は上の層に置かれるように考えますと、ピラミッドのような構想ができます。このピラミッドはスケールスペース(Scale Space)と言われます。それぞれの層にそれぞれの候補特徴があります。特定の特徴がもし主要特徴であれば、複数の層に渡って、この特徴が保持されると考えられます。これがポイントです。ノイズでできた候補特徴は層と層の間のチェックで段々消されます。最後に残る物として、有望な候補特徴のみです。 多くの層を作るので、時間掛かると思われますが、そんなに掛からないかもしれません。層毎に画像が小さくなりますので、\( n \)層目のサイズは\( \frac{2}{1.5^n} \)に比例します。つまり、ピラミッドの上に行けば、画像のサイズは急激に小さくなります。また、最初の処理に沢山の候補特徴が出てきますが、次の画像層に素早く落とされます。ピラミッドの毎層にも候補特徴が追加されますが、大した数にはなりません。 私の実験に、512×512の画像を使用しました。0.43秒で結果が出ます。最初の層に17867個の候補特徴が検出されますが、5階層を経て539個に収まります。ただし、実際に実験してみれば分かりますが、やはりチューニングが必要です。パラメータによって、画像別に効果がかなり違う場合があります。また実験しながら、いくつかの注意点があることを気づきました。 注意点1:画像補間とスムージングのステップにかなり注意が必要です。階層間の画像の内容の相対位置がずれないように確保しなければなりません。そうでなければ、下位階層の画像内容が上位階層に確認できなくなります。 注意点2:終了までの特徴候補数は何らかの制限が必要です。そうでなければ、殆どは淘汰されます。原因は簡単です。ピラミッドは段々に一点に集中します。情報量が小さくなり、全画像が少ない数点にブレンドします。最中的に特徴候補に値しない点が対応しているすべての候補特徴は淘汰されます。最後の一点にカバーされる候補特徴のみが残ります。