徹底比較OpenCV 2.4.3 vs OpenCV 2.4.2

はじめに

この記事はComputer Vision Advent Calendar 2012の12/22の記事として書いたものです.12/8に別の記事を書いたのですが懲りもせずに2周目にチャレンジです.

実質やったことは,以前やったマクロ調査と同レベルで2.4.2と2.4.3のコードをWinMergeで差分確認するだけの簡単なお仕事なので他の人に比べてクオリティがアレな感じなのはご容赦ください。。。


どんな内容?

2012年11月にOpenCV 2.4.3がリリースされましたが前バージョンの2.4.2とどこが違うの?という方も多いと思います.個人的な興味もあってコード差分を確認しながら気になった点をまとめてみました.2.4.2から2.4.3に移行するかどうか迷ってる方の判断材料となれば幸いです.


公式ChangeLog

公式が出しているChangeLogは以下の通りです.
http://code.opencv.org/projects/opencv/wiki/ChangeLog#243
http://opencv.org/opencv-2-4-3-released.html


追加されたCMakeオプション

2.4.3からいくつかCMakeオプションが追加されています.オプションがこれ以上増えるとわけがわからなくなる!というのは置いておいて追加されたオプションを紹介します.

CMakeオプション意味
WITH_GIGEAPIInclude Smartek GigE support
WITH_CSTRIPESInclude C= support
WITH_OPENCLInclude OpenCL Runtime support
WITH_OPENCLAMDFFTInclude AMD OpenCL FFT library support
WITH_OPENCLAMDBLASInclude AMD OpenCL BLAS library support
ENABLE_AVXEnable AVX instructions




その中からいくつかピックアップして解説してみます.

  • WITH_GIGEAPI
    GigE VisionはAutomated Imaging Association(AIA)によって定められた規格で,イーサネット技術がベースになっているので特別な端子やケーブルが不要で最大100mまでのケーブル長に対応できるのでマシンビジョン用途のカメラで採用されているようです.この規格のカメラがhighguiで簡単に使えるようになるのでマシンビジョン分野の人には嬉しい追加機能かもしれませんね.
  • WITH_OPENCL
    OpenCL実装のoclMatが使えるようになります.個人的にはかなり大きめな追加機能だと思います.また,CUDA実装であるgpuMatとかなり使い方が似ているのでgpuMatを使ったことがある方は結構すんなり導入できると思います(現時点ではgpuMatの方が対応関数多いですが・・・).簡単な使い方はOpenCV/Method used for oclMat on OpenCV 2.4.3を参考ください.
  • ENABLE_AVX
    SIMD命令の一つであるAVXの実装も(まだ対応されているのは少ないですが)追加されています.ただ,AVXは画像処理の実装ではちょっと扱いづらいこともあり,整数演算が使えるAVX2が登場すればAVX2対応が加速するのでは?と予想しています.

iOS向け

2.4.3でiOS向けの変更がかなりあるので関連ファイルの差分をピックアップしながら追っていきます(※結論から述べると個人的にはiOS SDK 6で開発している方には2.4.3をオススメします).

[iOS.cmake]
2.4.2:

# Hidden visibilty is required for cxx on iOS 
set (CMAKE_C_FLAGS "")
set (CMAKE_CXX_FLAGS "-headerpad_max_install_names -fvisibility=hidden -fvisibility-inlines-hidden")

2.4.3:

# Hidden visibilty is required for cxx on iOS
set (CMAKE_C_FLAGS "")
set (CMAKE_CXX_FLAGS "-stdlib=libc++ -headerpad_max_install_names -fvisibility=hidden -fvisibility-inlines-hidden")

set (CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG -O3 -fomit-frame-pointer -ffast-math")



2.4.3から最適化オプションが見直されました(そもそも2.4.2で最適化に関する問題が指摘されていたためですが・・・).また,2.4.3からlibc++が明示的に指定されるようになっている点は要注意です.

[build_framework.py]
2.4.3からarmv7sが正式にサポートされるようになりました.iOS SDK 6で開発されていて,armv7sアーキテクチャを有効に使いたい場合は2.4.3を使った方が良いと思われます.

[highgui]
iOSデバイスのカメラを使うためのクラスが追加されています.内部的にはAVFoundationを使ったカメラの制御になっているようです.

  • CvPhotoCameraクラス(静止画用)
  • CvVideoCameraクラス(動画用)

CvVideoCameraの使い方は公式のチュートリアルが参考になります.カメラ周りは色々とコーディングが面倒なのでこの辺を簡単に使えるようになるのは嬉しいです.


modules

2.4.3からopencv_worldモジュールが追加されました(正確にはiOS向けだけに提供されていたのですが2.4.3からそれ以外のプラットフォームでも有効になりました).

opencv_worldモジュールはOpenCVの全モジュール(core/imgproc/highgui etc…)を一つのライブラリにがっちゃんこしたものです.なので基本的にこのライブラリだけリンクしておけば全ての機能が使えることになります(ただし,特にiOS向けの場合プログラムサイズが大きくなるので注意!).BUILD_opencv_world – Memento Moriに詳しい解説があります.


3rdparty

OpenEXRがライブラリ同梱からソース同梱へ変更されました.以前はOpenCV/Method to enable OpenEXR on OpenCVのように自前でビルドする場合は涙ぐましい前準備が必要でしたが,CMake時に「WITH_OPENEXR」「BUILD_OPENEXR」をONにするだけでOpenCVビルド時に同梱ソースをビルドして勝手にリンクしてくれます.とても楽な時代になりましたね(苦笑)


core

様々な並列処理フレームワーク(TBB/OpenMP/GCD/C=/PPL)を抽象化するような関数が追加されています.そのため,自作関数を作る場合にこれらの関数を使うとマルチプラットフォーム対応になるだけでなく,並列処理フレームワーク毎に処理速度を比較することで使用フレームワーク検討が容易になるかもしれません.

  • ParallelLoopBody
  • parallel_for_
  • Mutex

[internal.hpp]
2.4.2:

#if defined ANDROID && defined __ARM_NEON__

2.4.3:

#ifdef __ARM_NEON__



2.4.2までCV_NEONというプリプロセッサ定義はANDROIDだけで定義されていましたが,2.4.3からこの制限が外れました.そのため,iOSでもCV_NEONが有効になります.CV_NEONが有効になる箇所を確認したところ,static関数のnormHamming関数で使われているようです.feature2dモジュールのDescriptorMatcherの中で使ってるようなのでこの辺を使う方には嬉しいかもしれません.


features2d

ICCV2011で発表されたBRISKが追加されています.実装は下記のファイルにあります.

modules/features2d/src/brisk.cpp

gpuMat

gpuMatで追加実装された機能のうち気になるものをピックアップしてみました.

  • bilateralFilter追加
  • HoughLines追加
  • HoughCircles追加
  • VideoReader_GPU追加
  • VideoWriter_GPU追加
  • resizeのリサイズ方法にINTER_AREA実装追加

個人的に気になるのはVideoReader/VideoWriterのCUDA実装は速いのか?ですね.
新しいPCにまだCUDAを入れていないので,そのうち試してみたいと思います.


highgui

  • png書き込みパラメータ追加
    enum
    {
    IMWRITE_JPEG_QUALITY =1,
    IMWRITE_PNG_COMPRESSION =16,
    IMWRITE_PNG_STRATEGY =17,
    IMWRITE_PNG_BILEVEL =18,
    IMWRITE_PNG_STRATEGY_DEFAULT =0,
    IMWRITE_PNG_STRATEGY_FILTERED =1,
    IMWRITE_PNG_STRATEGY_HUFFMAN_ONLY =2,
    IMWRITE_PNG_STRATEGY_RLE =3,
    IMWRITE_PNG_STRATEGY_FIXED =4,
    IMWRITE_PXM_BINARY =32
    };

    imwriteでpng保存する場合に指定できるパラメータとして「IMWRITE_PNG_BILEVEL」が追加されました.どういう経緯で追加されたのかよくわかりません(苦笑)

  • OpenNI関連パラメータ追加
    enum
    {
    CV_CAP_OPENNI_VGA_30HZ = 0,
    CV_CAP_OPENNI_SXGA_15HZ = 1,
    CV_CAP_OPENNI_SXGA_30HZ = 2,
    CV_CAP_OPENNI_QVGA_30HZ = 3,
    CV_CAP_OPENNI_QVGA_60HZ = 4
    };

    OpenNI関連パラメータとして「CV_CAP_OPENNI_QVGA_30HZ」「CV_CAP_OPENNI_QVGA_60HZ」が追加されました.どういう経緯で追加されたのか(ry

photo

photoモジュールはこれまでinpaintのみ提供されていましたが2.4.3から以下のDenoising関数が追加されました.

  • fastNlMeansDenoising
  • fastNlMeansDenoisingColored
  • fastNlMeansDenoisingMulti
  • fastNlMeansDenoisingColoredMulti

※詳細はDenoising — OpenCV v2.4.3 documentationを参照ください.

実装はNon-Local Means Denoisingのアルゴリズムがベースになっているようです.オンラインデモも公開されているので気になる方は試してみると良いかと思います.


おわりに

というわけで個人的に気になる変更点を好き勝手に色々書いてみました(ドラフト版ではもう少し細かい差分をピックアップしていたのですが力尽きました・・・).2.4.2から2.4.3に移行するかどうか迷ってる方の判断材料となれば幸いです.明日は@payashimさんの記事なので楽しみです!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です