OpenCV/Method used for oclMat on OpenCV 2.4.3 †
#multilang(ja){{
概要
OpenCLを使った実装oclMatがOpenCV 2.4.3より追加されました.
ここではoclMatの基本的な使い方を説明します.詳細は公式ドキュメントを参照ください.
※以降の説明は事前にOpenCL開発環境が導入されていることが前提です.
使い方
OpenCVのビルド
OpenCVをCMakeを用いてビルドする.
- WITH_OPENCLにチェックを入れた後,「Configure」ボタンを押し,「Generate」ボタンを押す.

- OpenCVをビルドする.
- oclライブラリをプロジェクトに追加する.
OS | ライブラリ名 |
Windows | opencv_ocl243.lib |
Mac | libopencv_ocl.dylib |
基本的な流れ
- cv::ocl::getDevice関数をコールしてOpenCLデバイスを初期化
- oclMatのコンストラクタを使ってcv::Matからcv::ocl::oclMatに変換
- oclMatで用意されている画像処理関数をコール(サンプルコードではocl::resizeを使用)
- download関数を使ってcv::ocl::oclMatからcv::Matに変換
サンプルコード
|
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/ocl/ocl.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
int main(int argc, const char * argv[])
{
Mat mat_src = imread("lena.jpg", IMREAD_UNCHANGED);
Mat mat_dst;
if(mat_src.empty()) return -1;
std::vector<ocl::Info> param;
ocl::getDevice(param, ocl::CVCL_DEVICE_TYPE_GPU);
ocl::oclMat oclmat_src(mat_src);
ocl::oclMat oclmat_dst;
ocl::resize(oclmat_src, oclmat_dst, cvSize(mat_src.cols*1.5, mat_src.rows*1.5), 0, 0, CV_INTER_NN);
oclmat_dst.download(mat_dst);
namedWindow("src");
imshow("src", mat_src);
namedWindow("dst");
imshow("dst", mat_dst);
waitKey(0);
destroyAllWindows();
return 0;
}
|
注意点
- OpenCLデバイスとCPU間の転送(upload,download)は遅いので呼び出しは必要最小限にする
- OpenCL実装関数の初回実行は(kernelのコンパイル含むため)遅いので起動時にダミーとして呼んでおくと良い
Contact
間違い・御指摘等ありましたら,
までメールにてご連絡ください.
}}
#multilang(en){{
Abstract
oclMat module(=OpenCL implementation) is added from OpenCV 2.4.3.
This page describes the method to use this module.
If you want to know the detailed information, please read
Official document.
The following description is assumed that the development environment of OpenCL has been installed previously.
Usage
Build OpenCV
You need to build OpenCV using CMake.
- Please enable WITH_OPENCL, push Configure button and push Generate button.

- Please build OpenCV.
- Please add the following library to your project.
OS | Library |
Windows | opencv_ocl243.lib |
Mac | libopencv_ocl.dylib |
Basic processing flow
- call cv::ocl::getDevice() for the initialization of OpenCL device.
- converts to cv::ocl::oclMat from cv::Mat by of the constructor of oclMat.
- call image processing function of oclMat.
- converts to cv::Mat from cv::ocl::oclMat by download().
Sample
|
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/ocl/ocl.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
int main(int argc, const char * argv[])
{
Mat mat_src = imread("lena.jpg", IMREAD_UNCHANGED);
Mat mat_dst;
if(mat_src.empty()) return -1;
std::vector<ocl::Info> param;
ocl::getDevice(param, ocl::CVCL_DEVICE_TYPE_GPU);
ocl::oclMat oclmat_src(mat_src);
ocl::oclMat oclmat_dst;
ocl::resize(oclmat_src, oclmat_dst, cvSize(mat_src.cols*1.5, mat_src.rows*1.5), 0, 0, CV_INTER_NN);
oclmat_dst.download(mat_dst);
namedWindow("src");
imshow("src", mat_src);
namedWindow("dst");
imshow("dst", mat_dst);
waitKey(0);
destroyAllWindows();
return 0;
}
|
Notes
- Transfer between CPU and GPU(upload() and download()) is very slow. So, you need to minimize the number of calls.
- The first execution of oclMat's image processing is slow. Because, compile of OpenCL kernel is processed too. You may avoid by the call of function as dummy at startup.
Contact
If you have question, please send e-mail to the following address.
}}