Upload
masaki-otsuki
View
4.042
Download
0
Embed Size (px)
Citation preview
2013/11/16 1
続OpenCV4Androidで画像処理アプリのススメ
~今度はちょっとアカデミックに~
2013/11/16 2
自己紹介• 名前:大槻 正樹
• TwitterID:@nekomeshi312 こんなアイコンです→
• 仕事:某メーカ研究部門所属
・・・毎日製品にならないような変な物作って遊んでいます。
・・・仕事はAndroidとは特に関係のないSunday Programmerです。
・・・こんなアプリ作ってます
2013/11/16 3
OpenCVって?
2013/11/16 4
OpenCVって?
• OpenCV ・・・ Open Source Computer Visionの略
画像認識に関する500以上の画像処理のライブラリ
• Linux、Windows、Android、iOS等をサポート
• 元はC言語 ・・今ではC++, Java, Pythonなどもサポート
• BSDライセンス
• 2013/11/16 現在のバージョン– 2.4.7
企業や大学での研究でも広く使われている画像処理ライブラリ
今でも新しく開発された画像処理アルゴリズムが頻繁に追加&VerUpされている。
2013/11/16 5
どんなことができる?
領域分割
機械学習 /画像認識
物体追跡
3次元復元
などなど・・・・
画像変換
特徴点検出
2013/11/16 6
という話を前回やりました
2013/11/16 7
前回はこんなこと話しました
• カメラ入力の色変換– 行数にしてたった13行
• オブジェクト認識– 約100行– 大事な点は三箇所のみ
2013/11/16 8
前回の資料はこちら
• http://slidesha.re/1dSP1kJ• OpenCVの歴史や導入方法についても説明しています
2013/11/16 9
あらかじめお断り
今回はまえがきが異常に長いです。
ご辛抱くださいませ
2013/11/16 10
コンピュータビジョンって?
• ンピュータビジョン(computer vision)は大雑把に言って、「ロボットの目」を作る研究分野である。
• この分野はコンピュータが実世界の情報を取得する全ての過程を扱うため、画像センシングのためのハードウェアから情報を認識するための人工知能的理論まで幅広く研究されている。また、近年ではコンピュータグラフィックスとコンピュータ・ビジョンの融合が注目を集めている。 wikipedia
2013/11/16 11
たとえば身近なところでは・・・
顔認識とか
人検出とか
三次元ステレオ計測とか
2013/11/16 12
International Conference●世界中の研究者・開発者が自分の開発した画像処理を発表してドヤ顔する場
●当然審査があるので全員が発表できるわけではない
大体平均20~30%。難しいセッションだと 2~3%というところもある。
ComputerVision & Pattern Recognition(CVPR) 2013/6 Portland
International Conference on Computer Vision(ICCV) 2013/12 Sydney
Special Interest Group on Computer GRAPHics(SIGGRAPH) 2013/8 LA
International Symposium on Mixed and Augmented Reality (ISMAR)2013/10 Adelaide
European Conference on Computer Vision (ECCV) 2012/10 Firenze
Asian Conference on Computer Vision(ACCV) 2012/11 Daejeon
2013/11/16 13
雰囲気はこんな感じ
注:これは2012年のCVPRの様子です。出典 http://www.slideshare.net/ttamaki/20120629prmu-cvpr2012
2013/11/16 14
モバイル機器を使ったWorkshopもありますWorkshop:特定のジャンルに絞って研究発表する会
2013/11/16 15
International Workshop on Mobile Vision• Poorな端末でいかに実用的な速度で動かすか、というところがメイン
例えば・・・
ステレオカメラをつけたスマホで周りの形とカメラの位置を計りつつ、リアルタイムでCGを重ねて表示する、とか
ゴツく見えるけどCortex A9 800MHz Dual Coreに
Android2.4.3で動かしている。
2013/11/16 16
International Workshop on Mobile Vision• 中には「なんでこんなのがいまさら発表できるの?」というのもあったりし
ます。
例えば・・・
スマホのカメラに望遠鏡を付けて拡大表示。
当然ぶれて見づらいので電子手ぶれ補正。
やっていることは20年前のビデオカメラと同じ・・・
ちなみに発表はHarvard大の人。(Medical Schoolだけど・・)
実際の処理もとても簡単だったので・・・・・
2013/11/16 17
作ってみました
入手はこちら:https://play.google.com/store/apps/details?id=com.nekomeshi312.stabcam
● ブレずに拡大
2013/11/16 18
基本原理
• Optical Flowオプティカルフローとは、視覚表現(通常、時間的に連続するデジタル画像)
の中で物体の動きをベクトルで表したものである。 wikipedia(?_?)こんなのです。
連続した2枚の画像から、画像に写った物体がどこに移動したかを計算するテクニック
画像が動いた分逆に動かしてやれば手ブレが補正できる。
2013/11/16 19
LK法(Lucas Kanade法)• LucasKanade法は1981年にLucas氏と金出氏によって発表された、物体
のエッジや模様などの特徴的な点を抽出し物体を追跡する基本的なアルゴリズム
http://www.youtube.com/watch?v=ysGM3CfBVpU
2013/11/16 20
LK法(Lucas Kanade法)
http://en.wikipedia.org/wiki/Lucas%E2%80%93Kanade_Optical_Flow_Method
t-1フレーム目 tフレーム目
(Vx, Vy)
X方向の画素差分
Y方向の画素差分 時間方向の画素差分周囲の画素で足し算
? ?ナンノコッチャ
求めたいOptical Flow
2013/11/16 21
LK法(Lucas Kanade法)間違いを恐れず超単純化して説明すると・・・・
(x, y)
位置xでの画素値 位置x+1での画素値
こんな輝度勾配が続いていると仮定
もし1フレーム前の画素値がこれだったら
ここから移動してきたってことでしょ
1画素で計算しても正しい答えは出ないので、周囲の画素を使って最小二乗法で解きます。
x
輝度
2013/11/16 22
とはいうものの
原理がわかったところで
一から自分でコーディングするのは大変・・・・・
2013/11/16 23
でもOpenCVを使うと
この1行でやってくれます。ヽ(=´▽`=)ノ
cv::calcOpticalFlowPyrLK();
これを言いたいがために長々と説明しました (f^^)
2013/11/16 24
実際の処理
if(prevPoints.size() > FEATURE_RECALC_NUMBER){cv::calcOpticalFlowPyrLK(引数いろいろ);//画像を移動させる処理
}else{
std::vector<cv::KeyPoint> prevKeypoints;cv::GoodFeaturesToTrackDetector detector(引数いろいろ);detector.detect(gGrayCur, prevKeypoints);//色々初期化
} (1)フロー計算に適した特徴点を見つけます。
(2)特徴点が十分たくさんある場合は・・(3)オプティカルフローを計
算します
このテクニックを Lucas Kanade Tomasi トラッカ と言います
カメラでキャプチャするたびに呼ばれます
2013/11/16 25
で、結果がこれ
入手はこちら:https://play.google.com/store/apps/details?id=com.nekomeshi312.stabcam
● ブレずに拡大
大事なことなので2度出しました。
2013/11/16 26
まとめ
• OpenCV4Android と言うよりは OpenCVについてちょっとアカデミックに紹介してみました。
• 正直、中のアルゴリズム知らなくても、APIだけ知っていれば結構なことができます。– 当然アルゴリズム知っている方が、使いこなしがうまくなります
• なんか画像処理やってみたいんだけど難しいことわからない、という方は、試しに使ってみるといいかもしれません。
• 参考資料や参考図書などは、前回の資料を参照してください。– http://slidesha.re/1dSP1kJ
2013/11/16 27
ソースコードはこちらから
https://github.com/Nekomeshi/StabCam.git
NDKを使っていますが、多分Javaで書いてもそんなに速度変わらないと思います。
2013/11/16 28
FIN