OpenCV/Method used for oclMat on OpenCV 2.4.3

#multilang(ja){{

概要

OpenCLを使った実装oclMatがOpenCV 2.4.3より追加されました.
ここではoclMatの基本的な使い方を説明します.詳細は公式ドキュメントを参照ください.
※以降の説明は事前にOpenCL開発環境が導入されていることが前提です.

使い方

OpenCVのビルド

OpenCVをCMakeを用いてビルドする.

  1. WITH_OPENCLにチェックを入れた後,「Configure」ボタンを押し,「Generate」ボタンを押す.
    cmake_with_opencl_0001.png


  2. OpenCVをビルドする.
  3. oclライブラリをプロジェクトに追加する.
    OSライブラリ名
    Windowsopencv_ocl243.lib
    Maclibopencv_ocl.dylib

基本的な流れ

  1. cv::ocl::getDevice関数をコールしてOpenCLデバイスを初期化
  2. oclMatのコンストラクタを使ってcv::Matからcv::ocl::oclMatに変換
  3. oclMatで用意されている画像処理関数をコール(サンプルコードではocl::resizeを使用)
  4. download関数を使ってcv::ocl::oclMatからcv::Matに変換

サンプルコード

fileoclmat_sample.cpp
/*
 * Abstract  : Sample of oclMat
 * File Name : oclmat_sample.cpp
 * Library   : OpenCV 2.4.3rc
 * Author    : dandelion
 * Date      : Oct 29, 2012; 14:55
 */

#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[])
{
    /* input image */
    Mat mat_src = imread("lena.jpg", IMREAD_UNCHANGED);
    Mat mat_dst;
    if(mat_src.empty()) return -1;
    
    /* initialise of ocl */
    std::vector<ocl::Info> param;
    ocl::getDevice(param, ocl::CVCL_DEVICE_TYPE_GPU);

    /* cv::Mat --> cv::ocl::oclMat */
    ocl::oclMat oclmat_src(mat_src);
    ocl::oclMat oclmat_dst;
    
    /* operation of ocl */
    ocl::resize(oclmat_src, oclmat_dst, cvSize(mat_src.cols*1.5, mat_src.rows*1.5), 0, 0, CV_INTER_NN);

    /* cv::Mat <-- cv::ocl::oclMat */
    oclmat_dst.download(mat_dst);

    /* display image */
    namedWindow("src");
    imshow("src", mat_src);
    namedWindow("dst");
    imshow("dst", mat_dst);
    
    waitKey(0);
    destroyAllWindows();
    
    return 0;
}

注意点

  • OpenCLデバイスとCPU間の転送(upload,download)は遅いので呼び出しは必要最小限にする
  • OpenCL実装関数の初回実行は(kernelのコンパイル含むため)遅いので起動時にダミーとして呼んでおくと良い

Contact

間違い・御指摘等ありましたら,

mail.png

までメールにてご連絡ください.

}}

#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.

  1. Please enable WITH_OPENCL, push Configure button and push Generate button.
    cmake_with_opencl_0001.png


  2. Please build OpenCV.
  3. Please add the following library to your project.
OSLibrary
Windowsopencv_ocl243.lib
Maclibopencv_ocl.dylib

Basic processing flow

  1. call cv::ocl::getDevice() for the initialization of OpenCL device.
  2. converts to cv::ocl::oclMat from cv::Mat by of the constructor of oclMat.
  3. call image processing function of oclMat.
  4. converts to cv::Mat from cv::ocl::oclMat by download().

Sample

fileoclmat_sample.cpp
/*
 * Abstract  : Sample of oclMat
 * File Name : oclmat_sample.cpp
 * Library   : OpenCV 2.4.3rc
 * Author    : dandelion
 * Date      : Oct 29, 2012; 14:55
 */

#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[])
{
    /* input image */
    Mat mat_src = imread("lena.jpg", IMREAD_UNCHANGED);
    Mat mat_dst;
    if(mat_src.empty()) return -1;
    
    /* initialise of ocl */
    std::vector<ocl::Info> param;
    ocl::getDevice(param, ocl::CVCL_DEVICE_TYPE_GPU);

    /* cv::Mat --> cv::ocl::oclMat */
    ocl::oclMat oclmat_src(mat_src);
    ocl::oclMat oclmat_dst;
    
    /* operation of ocl */
    ocl::resize(oclmat_src, oclmat_dst, cvSize(mat_src.cols*1.5, mat_src.rows*1.5), 0, 0, CV_INTER_NN);

    /* cv::Mat <-- cv::ocl::oclMat */
    oclmat_dst.download(mat_dst);

    /* display image */
    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.

mail.png }}


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2012-10-31 (水) 00:32:00 (1819d)