Weitere ähnliche Inhalte
Ähnlich wie 【関東GPGPU勉強会#2】OpenCVのOpenCL実装oclMat (20)
【関東GPGPU勉強会#2】OpenCVのOpenCL実装oclMat
- 7. OpenCLとは?
• Open Computing Languageの略称。
• ヘテロジーニアスな環境でプロセッサ(GPU, DSP,
Cell/B.E., CPU )の違いを吸収した共通API等を用いて
並列処理を記述するためのフレームワーク。Apple社
にて提案後、Khronos Groupが仕様策定。
• C99ベースの「OpenCL C言語」でデバイス向けのプロ
グラム開発を行うことができる。
http://www.khronos.org/opencl/
- 18. サンプルコード(グレースケール化)
#include <opencv2/core/utility.hpp>
#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)
{
std::vector<ocl::Info> oclinfo;
int devnums =
ocl::getDevice(oclinfo, ocl::CVCL_DEVICE_TYPE_GPU);
Mat src = imread("lena.jpg", IMREAD_UNCHANGED);
Mat dst;
ocl::oclMat oclsrc(src), ocldst;
ocl::cvtColor(oclsrc, ocldst, COLOR_BGR2GRAY);
ocldst.download(dst);
imwrite(“output.jpg", dst);
return 0;
}
グレースケール化
①ヘッダ読み込み
②oclMat初期化
③画像読み込み
④oclMat処理
⑤画像書き込み
- 19. サンプルコード(グレースケール化)
#include <opencv2/core/utility.hpp>
#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)
{
std::vector<ocl::Info> oclinfo;
int devnums =
ocl::getDevice(oclinfo, ocl::CVCL_DEVICE_TYPE_GPU);
Mat src = imread("lena.jpg", IMREAD_UNCHANGED);
Mat dst;
ocl::oclMat oclsrc(src), ocldst;
ocl::cvtColor(oclsrc, ocldst, COLOR_BGR2GRAY);
ocldst.download(dst);
imwrite(“output.jpg", dst);
return 0;
}
②oclMat初期化
③画像読み込み
④oclMat処理
⑤画像書き込み
oclMatを使うにはocl.hppの
インクルードが必要
①ヘッダ読み込み
OpenCVのヘッダをインクルード
- 20. サンプルコード(グレースケール化)
#include <opencv2/core/utility.hpp>
#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)
{
std::vector<ocl::Info> oclinfo;
int devnums =
ocl::getDevice(oclinfo, ocl::CVCL_DEVICE_TYPE_GPU);
Mat src = imread("lena.jpg", IMREAD_UNCHANGED);
Mat dst;
ocl::oclMat oclsrc(src), ocldst;
ocl::cvtColor(oclsrc, ocldst, COLOR_BGR2GRAY);
ocldst.download(dst);
imwrite(“output.jpg", dst);
return 0;
}
③画像読み込み
④oclMat処理
⑤画像書き込み
OpenCLデバイスリストの取得
(※ここではGPUのみを取得)
以下のような指定も可能。
CVCL_DEVICE_TYPE_ALL
OpenCLデバイスを全て取得
CVCL_DEVICE_TYPE_CPU
CPUのみを取得
etc...
注意点
oclMatを使う前にocl::getDeviceを
必ず呼ばないといけない点に注意。
②oclMat初期化
- 21. サンプルコード(グレースケール化)
#include <opencv2/core/utility.hpp>
#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)
{
std::vector<ocl::Info> oclinfo;
int devnums =
ocl::getDevice(oclinfo, ocl::CVCL_DEVICE_TYPE_GPU);
Mat src = imread("lena.jpg", IMREAD_UNCHANGED);
Mat dst;
ocl::oclMat oclsrc(src), ocldst;
ocl::cvtColor(oclsrc, ocldst, COLOR_BGR2GRAY);
ocldst.download(dst);
imwrite(“output.jpg", dst);
return 0;
}
④oclMat処理
⑤画像書き込み
画像ファイルを読みこんで
cv::Mat形式で格納する。
③画像読み込み
- 22. サンプルコード(グレースケール化)
#include <opencv2/core/utility.hpp>
#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)
{
std::vector<ocl::Info> oclinfo;
int devnums =
ocl::getDevice(oclinfo, ocl::CVCL_DEVICE_TYPE_GPU);
Mat src = imread("lena.jpg", IMREAD_UNCHANGED);
Mat dst;
ocl::oclMat oclsrc(src), ocldst;
ocl::cvtColor(oclsrc, ocldst, COLOR_BGR2GRAY);
ocldst.download(dst);
imwrite(“output.jpg", dst);
return 0;
}
⑤画像書き込み
oclMatのコンストラクタを生成して、
cv::Matの画像データをOpenCL
デバイスに転送する
④oclMat処理
oclMatの画像データに対して
グレースケール化を行う
グレースケールにした結果を
ホスト側に転送する
- 23. サンプルコード(グレースケール化)
#include <opencv2/core/utility.hpp>
#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)
{
std::vector<ocl::Info> oclinfo;
int devnums =
ocl::getDevice(oclinfo, ocl::CVCL_DEVICE_TYPE_GPU);
Mat src = imread("lena.jpg", IMREAD_UNCHANGED);
Mat dst;
ocl::oclMat oclsrc(src), ocldst;
ocl::cvtColor(oclsrc, ocldst, COLOR_BGR2GRAY);
ocldst.download(dst);
imwrite(“output.jpg", dst);
return 0;
}
⑤画像書き込み
グレースケール化した画像を
ファイルに書き込む
- 29. oclMatの内部処理(補足)
• OpenCL 1.1以上でないと使えない
• 2.4.5時点では同一環境に複数OpenCLデバイ
スがあっても同時に使えない
→Titan 2枚刺しフルに使えない\(^o^)/
• oclMatはbuffer objectとして処理される
( image objectではない)
http://docs.opencv.org/modules/ocl/doc/introduction.html