10LINEひさしぶりのブログ。ブラウザの処理能力の進化を測るには個人的に画像処理が一番わかりやすいです。エッジの交点)を検出をしてみます。コーナー検出に用いられる特徴点検出法はいくつか提案されていますが、今回はブラウザ上で実行することを考慮し計算量とメモリ使用量の観点からHarrisオペレータを採用します。Operatorコーナー検出法についてはWikipediaを参考に。WikipediaHarrisオペレータは微分幾何学に基づくアプローチを採っています。難しいことは置いといて簡単に説明すると、「一次微分値(差分)が一方向に大きければエッジ、多方向に大きければコーナーである」という知識に基づいて計算されます。特徴”点”を求めるには通常は二次微分が必要ですが、Harrisオペレータではガウシアン平滑化で以て二次微分計算を代用しています。opencv.jpより画像引用)。うれしいことに固有値分解をわざわざ計算せずに済むわけです。kの値は賢い大人達の経験的に0.04~0.15が良いとされているようです。実装上ではPrewittフィルタとガウシアンフィルタを組み合わせて素朴に実装している例はよく見かけますが、OpenCVの実装(cv::cornerHarris)ではSobelフィルタとボックスフィルタ(非正規化)を組み合わせているようです。今回作ったデモではOpenCVの方の実装アルゴリズムをJavaScriptに移植しました。ちなみにこれらの計算はコンピュータでは並列化しやすく、実際にOpenCVでは可能であればGPUやSSEの力を借りて計算する実装になっています。ActionScriptに移植するならStage3Dを上手く使えないでしょうか?(無知)以下、デモを載せます。スマートフォン端末だと厳しいかと思いますのでPCから。Safariでは動作確認していますがやはり重いです。Opera12.0で動作確認済み)ソースコードはGitHubに置きましたのでもし興味があれば。Harris検出器本体のソースコードは外部ライブラリ等を用いていません。GitHub使い方は以下の通り。以前のJavaScriptで2D-FFTによるハイパス/ローパスフィルタでも書きましたが、2012/09現在だと画像処理関連のクロスブラウザ対応についてはOperaが意外とネックになったりします(飽和演算とか)。IEはver9.0なら特別な対応を行わなくても動作することが多いなぁという印象。処理速度についてはアルゴリズムによってFirefoxとChromeが勝ったり負けたりでなかなか面白いです。Operaが少し遅れを取るようで、IE9は桁違いに遅いです。Safariは知りません。Workersの利用判断についてですが、ブラウザの処理能力は日進月歩なのであまり経験則に頼らない方がいいと思います。Workersの利用有無で柔軟に処理を切り替えられる綺麗な実装パターンとしてはどういう方法が良いんでしょうかね。利用する実装にしているのですが、速くなるブラウザもあれば遅くなるブラウザもあってよくわからないです。ばらつきが大きくなるのは避けたい所なので素直にArrayを使った方が現在はまだ良い気がします。Arrayの実装を見比べたいところです。最初に書いたようにコーナー検出に利用できる特徴量はこれまでいくつかの手法が提案されてきましたが、最近ではFAST特徴がよく用いられています。BRIEF)特徴の構成要素としてもFASTが利用されています。Rosten)を見て絶望感に包まれました。アレをスクリプト言語で一から移植するには日曜プログラマの僕には困難な気がします。JSの場合だとスクリプトの読み込みにものすごい時間がかかるのではないでしょうか。日曜の作業時間内で簡単に試せる手法を探しつつ、HTML5とJavaScriptの勉強も併せて進めていきたいなと思います。コメントをキャンセルメールアドレスが公開されることはありません。