Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
OpenCVの新機能
UMatを先取りしよう
関東GPGPU勉強会#3
2013/11/30
@dandelion1124
自己紹介(1/3)
Twitter:@dandelion1124
• 学生時代は画像処理の研究に従事。

• 現在は都内勤務エンジニア。
• 研究室でOpenCVのTipsサイトを作っていたらOpenCV関連書籍を
書くことになり今に至る。

...
自己紹介(2/3)
• 書籍執筆
– OpenCVプログラミングブック

• 和訳本(原稿チェック)
– 詳解 OpenCV
– 実践 コンピュータビジョン

• 雑誌関連
– 日経ソフトウェア(2011年3月号)
特集記事担当
自己紹介(3/3)
• メインで活動している勉強会
– 関東コンピュータビジョン勉強会 #cvsaisentan
http://sites.google.com/site/cvsaisentan/
本日のアジェンダ
•
•
•
•
•
•
•

OpenCVとは?
前置き
OpenCVのデータ構造
UMatとは?
サンプルコード
UMatを使うには
UMatのTips

本題に入る前の前準備

本日のメイン
OpenCVとは?
Intelが開発・公開したOpen SourceのComputer Vision
ライブラリ。現在はWillow Garageが開発を行っている。
http://opencv.org/
• 公式サポートOS
– Window...
前置き
ある日OpenCV MeetingNotesで以下の記載を見かける
– 3.0 will do a lot more work on this. But OpenCL will vanish
and be put into automa...
前置き
ある日OpenCV MeetingNotesで以下の記載を見かける
– 3.0 will do a lot more work on this. But OpenCL will vanish
and be put into automa...
前置き
という残念な理由からUMatについて説明することに
しました。
ただし、あくまでOpenCV 3.0で入る予定の機能なので、正式な
導入時は本発表時と内容が変わっている可能性がある点
ご了承ください。
前置き
というか、そもそも、最新コード
(https://github.com/Itseez/opencv/)に
UMat実装されているんでしょうか?
前置き
というか、そもそも、最新コード
(https://github.com/Itseez/opencv/)に
UMat実装されているんでしょうか?

あった!
modules/core/src/umatrix.cpp
前置き
じゃあ、開発版ドキュメント読んでみようかな?
http://docs.opencv.org/trunk/modules/core/doc/core.html
前置き
じゃあ、開発版ドキュメント読んでみようかな?
http://docs.opencv.org/trunk/modules/core/doc/core.html

「UMatのドキュメントはまだ無い」
(※2013/11/29時点)
ご清聴ありがとうございました
前置き
ドキュメントが無いので、しぶしぶソースを
読んで使い方を調べることにしました。
というわけで、本編に戻ります。
OpenCVの画像データ構造
OpenCVで画像を格納するために使うデータ構造は
おおまかに以下の4つ。
•
•
•
•

cv::Mat
gpu::GpuMat
ocl::oclMat
cv::UMat

画像データの入れ物(CPU版)
画像...
OpenCVの画像データ構造
OpenCVで画像を格納するために使うデータ構造は
おおまかに以下の4つ。
•
•
•
•

cv::Mat
gpu::GpuMat
ocl::oclMat
cv::UMat

画像データの入れ物(CPU版)
画像...
OpenCVの画像データ構造
OpenCVで画像を格納するために使うデータ構造は
おおまかに以下の4つ。
•
•
•
•

cv::Mat
gpu::GpuMat
ocl::oclMat
cv::UMat

画像データの入れ物(CPU版)
画像...
UMatとは?
• Mat/oclMat間の差異を隠蔽したデータ構造
• UMatに画像データを入れて画像処理の関数
を実行すると、OpenCLが使える環境なら自動
でOpenCL実装を使ってくれる
• UMatを使って実装しておけばCPU/O...
UMatとは?
• Mat/oclMat間の差異を隠蔽したデータ構造
• UMatに画像データを入れて画像処理の関数
を実行すると、OpenCLが使える環境なら自動
でOpenCL実装を使ってくれる
• UMatを使って実装しておけばCPU/O...
UMatとは?
UMatに画像データを格納
OpenCV内部で
勝手にやってくれる

OpenCVの画像処理関数をコール

OpenCLが使える
実行環境?

No

Yes

oclMatの実装を使う

Matの実装を使う
UMatとは?
• Mat/oclMat間の差異を隠蔽したデータ構造
• UMatに画像データを入れて画像処理の関数
を実行すると、OpenCLが使える環境なら自動
でOpenCL実装を使ってくれる
• UMatを使って実装しておけばCPU/O...
サンプルコード(グレースケール化)
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui.hpp>
u...
サンプルコード(グレースケール化)
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui.hpp>
#...
UMatのサンプルコードを使って
各処理をもう少し詳しく説明します
サンプルコード(グレースケール化)
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui.hpp>
#...
サンプルコード(グレースケール化)
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui.hpp>
#...
サンプルコード(グレースケール化)
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui.hpp>
#...
サンプルコード(グレースケール化)
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui.hpp>
#...
サンプルコード(グレースケール化)
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui.hpp>
#...
サンプルコード(グレースケール化)
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui.hpp>
#...
UMatを使うには

■開発版OpenCVコード入手
2.4.xにはUMat実装が入っていないので
git or githubから開発版のコードを取得
する必要があります
https://github.com/Itseez/opencv/

■...
UMatのTips
• 今の実行環境でOpenCL環境が使えるかどう
かを調べるユーティリティ関数があります
– ocl::haveOpenCL()

• UMatの処理でOpenCL実装を使うかを知るた
めのユーティリティ関数があります
– ...
UMatのTips
• ユーザによってはUMatの処理で勝手に
OpenCL側の処理に入って欲しくない場合もあ
るのでは?
– ocl::setUseOpenCL関数にtrue/falseを指定すること
でUMatでOpenCLを使う/使わない...
まとめ
• OpenCV 3.0あたりからUMatというデータ構造が追
加される予定
• UMatを使うとCPU/OpenCLの実装コードを共通化で
きる
• UMatを使った実装を行うとき、CPUモードでアルゴリ
ズムを検証してから、Open...
おわり
You’ve finished this document.
Download and read it offline.
Upcoming SlideShare
【関東GPGPU勉強会#2】OpenCVのOpenCL実装oclMat
Next
Upcoming SlideShare
【関東GPGPU勉強会#2】OpenCVのOpenCL実装oclMat
Next
Download to read offline and view in fullscreen.

23

Share

【関東GPGPU勉強会#3】OpenCVの新機能 UMatを先取りしよう

Download to read offline

【関東GPGPU勉強会#3】OpenCVの新機能 UMatを先取りしよう

Related Books

Free with a 30 day trial from Scribd

See all

Related Audiobooks

Free with a 30 day trial from Scribd

See all

【関東GPGPU勉強会#3】OpenCVの新機能 UMatを先取りしよう

  1. 1. OpenCVの新機能 UMatを先取りしよう 関東GPGPU勉強会#3 2013/11/30 @dandelion1124
  2. 2. 自己紹介(1/3) Twitter:@dandelion1124 • 学生時代は画像処理の研究に従事。 • 現在は都内勤務エンジニア。 • 研究室でOpenCVのTipsサイトを作っていたらOpenCV関連書籍を 書くことになり今に至る。 blog: http://www.atinfinity.info/blog/ wiki: http://www.atinfinity.info/wiki/
  3. 3. 自己紹介(2/3) • 書籍執筆 – OpenCVプログラミングブック • 和訳本(原稿チェック) – 詳解 OpenCV – 実践 コンピュータビジョン • 雑誌関連 – 日経ソフトウェア(2011年3月号) 特集記事担当
  4. 4. 自己紹介(3/3) • メインで活動している勉強会 – 関東コンピュータビジョン勉強会 #cvsaisentan http://sites.google.com/site/cvsaisentan/
  5. 5. 本日のアジェンダ • • • • • • • OpenCVとは? 前置き OpenCVのデータ構造 UMatとは? サンプルコード UMatを使うには UMatのTips 本題に入る前の前準備 本日のメイン
  6. 6. OpenCVとは? Intelが開発・公開したOpen SourceのComputer Vision ライブラリ。現在はWillow Garageが開発を行っている。 http://opencv.org/ • 公式サポートOS – Windows/Linux/Mac OS/Android/iOS • 公式サポート言語 – C/C++/Python/Java ※有志による非公式ラッパーは以下のサイトにまとめています。 http://www.atinfinity.info/wiki/index.php?OpenCV%2FOpenCV%20wrapper%20list
  7. 7. 前置き ある日OpenCV MeetingNotesで以下の記載を見かける – 3.0 will do a lot more work on this. But OpenCL will vanish and be put into automatic acceleration in the other modules • It will accelerate automatically if you use "umat" (Universal Matrix). • Tests often show 10 to 100x acceleration on GPU – If user casts to umat and pass to functions, it will use GPU acceleration if available achieving the speedup. • Data is not copied in conversion back and forth between mat and umat. Use mat if you want pixel access. http://code.opencv.org/projects/opencv/wiki/2013#2013-11-05 から抜粋
  8. 8. 前置き ある日OpenCV MeetingNotesで以下の記載を見かける – 3.0 will do a lot more work on this. But OpenCL will vanish and be put into automatic acceleration in the other modules • It will accelerate automatically if you use "umat" (Universal Matrix). • Tests often show 10 to 100x acceleration on GPU – If user casts to umat and pass to functions, it will use GPU acceleration if available achieving the speedup. • Data is not copied in conversion back and forth between mat and umat. Use mat if you want pixel access. なんか凄そう! (小並感) http://code.opencv.org/projects/opencv/wiki/2013#2013-11-05 から抜粋
  9. 9. 前置き という残念な理由からUMatについて説明することに しました。 ただし、あくまでOpenCV 3.0で入る予定の機能なので、正式な 導入時は本発表時と内容が変わっている可能性がある点 ご了承ください。
  10. 10. 前置き というか、そもそも、最新コード (https://github.com/Itseez/opencv/)に UMat実装されているんでしょうか?
  11. 11. 前置き というか、そもそも、最新コード (https://github.com/Itseez/opencv/)に UMat実装されているんでしょうか? あった! modules/core/src/umatrix.cpp
  12. 12. 前置き じゃあ、開発版ドキュメント読んでみようかな? http://docs.opencv.org/trunk/modules/core/doc/core.html
  13. 13. 前置き じゃあ、開発版ドキュメント読んでみようかな? http://docs.opencv.org/trunk/modules/core/doc/core.html 「UMatのドキュメントはまだ無い」 (※2013/11/29時点)
  14. 14. ご清聴ありがとうございました
  15. 15. 前置き ドキュメントが無いので、しぶしぶソースを 読んで使い方を調べることにしました。 というわけで、本編に戻ります。
  16. 16. OpenCVの画像データ構造 OpenCVで画像を格納するために使うデータ構造は おおまかに以下の4つ。 • • • • cv::Mat gpu::GpuMat ocl::oclMat cv::UMat 画像データの入れ物(CPU版) 画像データの入れ物(CUDA版) 画像データの入れ物(OpenCL版) 画像データの入れ物(CPU/OpenCL版)
  17. 17. OpenCVの画像データ構造 OpenCVで画像を格納するために使うデータ構造は おおまかに以下の4つ。 • • • • cv::Mat gpu::GpuMat ocl::oclMat cv::UMat 画像データの入れ物(CPU版) 画像データの入れ物(CUDA版) 画像データの入れ物(OpenCL版) 画像データの入れ物(CPU/OpenCL版) oclMatについては前回勉強会の発表資料を参照ください。 http://www.slideshare.net/YasuhiroYoshimura/gpgpu2opencvopencloclmat ※上記資料は2013年6月時点のものなので最新版ではAPI仕様が少し変わっています。
  18. 18. OpenCVの画像データ構造 OpenCVで画像を格納するために使うデータ構造は おおまかに以下の4つ。 • • • • cv::Mat gpu::GpuMat ocl::oclMat cv::UMat 画像データの入れ物(CPU版) 画像データの入れ物(CUDA版) 画像データの入れ物(OpenCL版) 画像データの入れ物(CPU/OpenCL版) 今日のお話はこの部分がメイン
  19. 19. UMatとは? • Mat/oclMat間の差異を隠蔽したデータ構造 • UMatに画像データを入れて画像処理の関数 を実行すると、OpenCLが使える環境なら自動 でOpenCL実装を使ってくれる • UMatを使って実装しておけばCPU/OpenCLの コードを共通化できる
  20. 20. UMatとは? • Mat/oclMat間の差異を隠蔽したデータ構造 • UMatに画像データを入れて画像処理の関数 を実行すると、OpenCLが使える環境なら自動 でOpenCL実装を使ってくれる • UMatを使って実装しておけばCPU/OpenCLの コードを共通化できる
  21. 21. UMatとは? UMatに画像データを格納 OpenCV内部で 勝手にやってくれる OpenCVの画像処理関数をコール OpenCLが使える 実行環境? No Yes oclMatの実装を使う Matの実装を使う
  22. 22. UMatとは? • Mat/oclMat間の差異を隠蔽したデータ構造 • UMatに画像データを入れて画像処理の関数 を実行すると、OpenCLが使える環境なら自動 でOpenCL実装を使ってくれる • UMatを使って実装しておけばCPU/OpenCLの コードを共通化できる
  23. 23. サンプルコード(グレースケール化) #include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/highgui.hpp> using namespace cv; int main(int argc, char** argv) { Mat src = imread(“lena.jpg ", IMREAD_UNCHANGED); Mat dst; cvtColor(src, dst, COLOR_BGR2GRAY); imwrite (“lena_gray.jpg", dst); return 0; #include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/highgui.hpp> #include <opencv2/ocl/ocl.hpp> using namespace cv; int main(int argc, char** argv) { Mat src = imread(“lena.jpg ", IMREAD_UNCHANGED); Mat dst; ocl::oclMat oclsrc (src ); ocl::oclMat ocldst; ocl::cvtColor(oclsrc, ocldst, COLOR_BGR2GRAY); ocldst.download(dst); } imwrite (“lena_gray.jpg", dst); return 0; } Mat(CPU版)のコード oclMat(OpenCL版)のコード 点線で囲った部分が共通化できていないコード部分
  24. 24. サンプルコード(グレースケール化) #include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/highgui.hpp> #include <opencv2/ocl/ocl.hpp> using namespace cv; int main(int argc, char** argv) { Mat src = imread(“lena.jpg ", IMREAD_UNCHANGED); UMat usrc = src.getUMat(ACCESS_READ); UMat udst; cvtColor(usrc, udst, COLOR_BGR2GRAY); imwrite (“lena_gray.jpg", udst); return 0; } UMat(CPU/OpenCL版)のコード UMatを使って実装するとCPU/OpenCLのコードを共通化できる!
  25. 25. UMatのサンプルコードを使って 各処理をもう少し詳しく説明します
  26. 26. サンプルコード(グレースケール化) #include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/highgui.hpp> #include <opencv2/ocl/ocl.hpp> using namespace cv; ①ヘッダ読み込み int main(int argc, char** argv) { Mat src = imread(“lena.jpg ", IMREAD_UNCHANGED); ②画像読み込み ③UMat初期化 UMat usrc = src.getUMat(ACCESS_READ); UMat udst; ④画像処理 cvtColor(usrc, udst, COLOR_BGR2GRAY); ⑤画像書き込み imwrite (“lena_gray.jpg", udst); return 0; } グレースケール化
  27. 27. サンプルコード(グレースケール化) #include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/highgui.hpp> #include <opencv2/ocl/ocl.hpp> using namespace cv; ①ヘッダ読み込み int main(int argc, char** argv) { Mat src = imread(“lena.jpg ", IMREAD_UNCHANGED); UMatを使うにはocl.hppの インクルードが必要 ②画像読み込み ③UMat初期化 UMat usrc = src.getUMat(ACCESS_READ); UMat udst; ④画像処理 cvtColor(usrc, udst, COLOR_BGR2GRAY); ⑤画像書き込み imwrite (“lena_gray.jpg", udst); return 0; } OpenCVのヘッダをインクルード
  28. 28. サンプルコード(グレースケール化) #include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/highgui.hpp> #include <opencv2/ocl/ocl.hpp> using namespace cv; int main(int argc, char** argv) { Mat src = imread(“lena.jpg ", IMREAD_UNCHANGED); ③UMat初期化 UMat usrc = src.getUMat(ACCESS_READ); UMat udst; ④画像処理 cvtColor(usrc, udst, COLOR_BGR2GRAY); ⑤画像書き込み imwrite (“lena_gray.jpg", udst); return 0; } ②画像読み込み 画像ファイルを読みこんで Mat形式で格納する。
  29. 29. サンプルコード(グレースケール化) #include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/highgui.hpp> #include <opencv2/ocl/ocl.hpp> using namespace cv; int main(int argc, char** argv) { Mat src = imread(“lena.jpg ", IMREAD_UNCHANGED); UMat usrc = src.getUMat(ACCESS_READ); UMat udst; ④画像処理 cvtColor(usrc, udst, COLOR_BGR2GRAY); ⑤画像書き込み imwrite (“lena_gray.jpg", udst); return 0; } ③UMat初期化 srcに入れたデータをもとに UMatのインスタンスを作る
  30. 30. サンプルコード(グレースケール化) #include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/highgui.hpp> #include <opencv2/ocl/ocl.hpp> using namespace cv; int main(int argc, char** argv) { Mat src = imread(“lena.jpg ", IMREAD_UNCHANGED); UMat usrc = src.getUMat(ACCESS_READ); UMat udst; cvtColor(usrc, udst, COLOR_BGR2GRAY); ⑤画像書き込み imwrite (“lena_gray.jpg", udst); return 0; } ④画像処理 グレースケール化する
  31. 31. サンプルコード(グレースケール化) #include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/highgui.hpp> #include <opencv2/ocl/ocl.hpp> using namespace cv; int main(int argc, char** argv) { Mat src = imread(“lena.jpg ", IMREAD_UNCHANGED); UMat usrc = src.getUMat(ACCESS_READ); UMat udst; cvtColor(usrc, udst, COLOR_BGR2GRAY); imwrite (“lena_gray.jpg", udst); return 0; } ⑤画像書き込み グレースケール化した画像を ファイルに書き込む
  32. 32. UMatを使うには ■開発版OpenCVコード入手 2.4.xにはUMat実装が入っていないので git or githubから開発版のコードを取得 する必要があります https://github.com/Itseez/opencv/ ■OpenCL環境導入 PCにOpenCLのSDKをインストールして おく必要がある ■CMake CMakeで以下の手順を行うことで ソリューションファイルが生成される ①「WITH_OPENCL」にチェックを入れる ②「Configure」ボタンを押す ③「Generate」ボタンを押す ④生成されたソリューションを使って OpenCVのライブラリを生成
  33. 33. UMatのTips • 今の実行環境でOpenCL環境が使えるかどう かを調べるユーティリティ関数があります – ocl::haveOpenCL() • UMatの処理でOpenCL実装を使うかを知るた めのユーティリティ関数があります – ocl::useOpenCL() ただし、#include <opencv2/core/ocl.hpp> を追加する必要あり!
  34. 34. UMatのTips • ユーザによってはUMatの処理で勝手に OpenCL側の処理に入って欲しくない場合もあ るのでは? – ocl::setUseOpenCL関数にtrue/falseを指定すること でUMatでOpenCLを使う/使わないを決められます。 ただし、#include <opencv2/core/ocl.hpp> を追加する必要あり!
  35. 35. まとめ • OpenCV 3.0あたりからUMatというデータ構造が追 加される予定 • UMatを使うとCPU/OpenCLの実装コードを共通化で きる • UMatを使った実装を行うとき、CPUモードでアルゴリ ズムを検証してから、OpenCLモードに切り替えるの も容易そう • 「UMatのドキュメントはまだ無い」(※2013/11/29時 点) • 正式発表を楽しみに待ちましょう!
  36. 36. おわり
  • DaisukeKato4

    Nov. 5, 2020
  • discypus

    Feb. 2, 2018
  • yosukehorie7

    Apr. 14, 2016
  • 100002248788113

    Jan. 17, 2016
  • m0tchy1

    Oct. 12, 2015
  • ssuser901a8c

    Oct. 11, 2015
  • share_sabi

    Sep. 24, 2015
  • sanoakira

    Sep. 17, 2015
  • KanSakamoto

    Aug. 1, 2015
  • ShoeKurtz

    Mar. 6, 2015
  • takashiishibashi7

    Jan. 31, 2015
  • tokoik

    Jan. 29, 2015
  • satoshibfujimoto

    Jan. 12, 2015
  • daemonzzz

    Dec. 15, 2014
  • masaf129

    Aug. 19, 2014
  • ttt1982

    Jun. 17, 2014
  • jeakkoutanapple

    Apr. 25, 2014
  • skkmania

    Feb. 27, 2014
  • yasnakamura

    Feb. 17, 2014
  • TakeshiWatanabe2

    Dec. 5, 2013

【関東GPGPU勉強会#3】OpenCVの新機能 UMatを先取りしよう

Views

Total views

15,581

On Slideshare

0

From embeds

0

Number of embeds

1,578

Actions

Downloads

69

Shares

0

Comments

0

Likes

23

×