連載記事4回目は初めてのOpenCV開発 ― coreモジュール【OpenCV 2.4.9】という記事を書きました.
OpenCVで最も基本となるcoreモジュールの概要やユーティリティ機能について紹介しています。※coreモジュール、highguiモジュールを1回の記事でまとめようと思っていたのですが思いの外ボリュームがあったので分割することになりました.
次回はhighguiモジュールの概要と使い方について解説予定です.
連載記事4回目は初めてのOpenCV開発 ― coreモジュール【OpenCV 2.4.9】という記事を書きました.
OpenCVで最も基本となるcoreモジュールの概要やユーティリティ機能について紹介しています。※coreモジュール、highguiモジュールを1回の記事でまとめようと思っていたのですが思いの外ボリュームがあったので分割することになりました.
次回はhighguiモジュールの概要と使い方について解説予定です.
OpenCLを用いてMat型の画像を並列に処理したいと考えています
http://answers.opencv.org/question/26658/custom-opencl-kernel-in-opencv/
上のサイトにあるように自作のカーネルを定義してoclの関数を使って実行したいと考えているのですがサイトのanswerのようにopenCLExecuteKernelInteropを実行すると
Floating point exception: 8
というランタイムエラーが出てしまいます
何かわかるようでしたらお教えください
よろしくお願いいたします
はじめまして。カーネル名の指定が合っていないこととlocalThreadsの設定が不適切なのでランタイムエラーが出ています。エラーが出ないところまでは突き止めて何点か修正しました。ただし、結果がうまく入っていないようなので要調査です。
https://gist.github.com/atinfinity/8c25c8fb1b3708aa0944
oclMatで自作カーネルを動かすサンプルプログラムが正常に動作するようになったので下記URLで公開しています(シンプルなカーネルにするためネガポジ反転のサンプルです)。
https://gist.github.com/atinfinity/8c25c8fb1b3708aa0944
こんなに早く回答していただけるとは思っていませんでした
ありがとうございます
ソースコードを実行しましたが以下のランタイムエラーが出てしまいます
OpenCV Error: Gpu API call (CL_INVALID_ARG_SIZE) in openCLExecuteKernelInterop, file /opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_tarballs_ports_graphics_opencv/opencv/work/opencv-2.4.10/modules/ocl/src/cl_operations.cpp, line 524
libc++abi.dylib: terminating with uncaught exception of type cv::Exception: /opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_tarballs_ports_graphics_opencv/opencv/work/opencv-2.4.10/modules/ocl/src/cl_operations.cpp:524: error: (-217) CL_INVALID_ARG_SIZE in function openCLExecuteKernelInterop
環境はMacOSXです
Windowsなら動いているのでしょうか?
度々申し訳ありません。宜しくお願いします
使用されているOpenCLのフレームワークはMacOSX搭載のものでしょうか?
(それともAMDやNVIDIAのOpenCL SDK?)
以下の環境で動作確認しています。
・OpenCV 2.4.9
・Windows 8.1
・VS2012
・NVIDIA OpenCL
おそらくエラーメッセージから推測するに
args.push_back( std::make_pair( 4, (void *) &source.data ));
args.push_back( std::make_pair( 4, (void *) &dest.data ));
というところを
args.push_back( std::make_pair( sizeof(cl_mem), (void *) &source.data ));
args.push_back( std::make_pair( sizeof(cl_mem), (void *) &dest.data ));
とすれば動きそうな気がします。
ただし、cl_mem構造体はoclモジュールのヘッダをインクルードするだけでは参照できないのでMacOSXに搭載されているOpenCLを使うのであれば
の一行を追加する必要があります。
無事動きました
ありがとうございました