OpenCV に関するメモ

作成開始:2014/07/06(日)
最終更新:2016/10/22(土)

OpenCV の使い方や内部実装を調べながら作成中のメモ. おもに 2.4.x だが,ぼちぼち 3.1.0 についても追記中.


目次

バージョン番号

バージョン番号取得用マクロ

バージョン番号は opencv2/core/version.hpp で定義されているが,2.4.* と 3.1.* ではマクロ名が異なっている.
(2.4.{7,9,10,11,13} と 3.1.0 で確認.)

バージョン番号が x.y.z(.r) または x.y.z(-status) の場合,次のように定義されている.


Version x y z r status 備考
2.y.z(.r) CV_VERSION_EPOCH
(=2)
CV_VERSION_MAJOR
(=y)
CV_VERSION_MINOR
(=z)
CV_VERSION_REVISION
(=r)
- r が省略された場合は 0.
3.y.z(-status) CV_VERSION_MAJOR
(=3)
CV_VERSION_MINOR
(=y)
CV_VERSION_REVISION
(=z)
- CV_VERSION_STATUS
(=status)
status (文字列型) は "","-rc1" など.

CV_VERSION はバージョン全体を文字列化したマクロ.

#include <opencv2/core.hpp>

printf("OpenCV Version: \"%s\"\n", CV_VERSION); // → "3.0.0-rc1" など.

ちなみに,CV_VERSION の定義で用いられている CVAUX_STR( ) は,引数をマクロ展開したトークン列を文字列化するマクロである. CVAUX_STRW( ) はワイド文字列バージョン.

参考


バージョン番号全体を単一の整数値で取得するマクロ

上記のとおり,OpenCV 2 と 3 ではバージョン番号のマクロ名が異なっているので, 2 と 3 にまたがるバージョン番号の比較が面倒である.そこで次のマクロを考案した.
(2.4.{7,9,10,11,13} と 3.1.0 で確認.)

#ifdef CV_VERSION_EPOCH // OpenCV 2
// OpenCV 2.y.z.r → 2yyzzrr
#define OPENCV_VERSION \
    (CV_VERSION_EPOCH * 1000000 + CV_VERSION_MAJOR * 10000 + \
     CV_VERSION_MINOR * 100 + CV_VERSION_REVISION)
#else // OpenCV 3 では CV_VERSION_EPOCH が定義されていない.
// OpenCV 3.y.z → 3yyzz00
#define OPENCV_VERSION \
    (CV_VERSION_MAJOR * 1000000 + CV_VERSION_MINOR * 10000 + CV_VERSION_REVISION * 100)
#endif // CV_VERSION_EPOCH

OPENCV_VERSION はバージョン番号全体 (status を除く) を単一の整数として取得するのでバージョン 2 と 3 にまたがる比較が簡単になる.
OpenCV 2.y.z.r は10進数 2yyzzrr に,OpenCV 3.y.z は 3yyzz00 になる.

2016/10/22(土) 考案

画像処理

色空間の変換

void cv::cvtColor(InputArray src, OutputArray dst, int code, int dstCn = 0)
  • 機能
    画像の色空間を変換する.
  • 入力
    • src:入力画像 (CV_8U,CV_16U,CV_32F).
    • code:色空間変換コード (下記).
    • dstCn:出力画像のチャネル数.0を指定した場合は src と code から自動的に決定する.
  • 出力
    • dst:出力画像.サイズと深度は src と同じ.
  • 参考
    • cvtColor (本家マニュアル)
    • ソース
      $(OpenCV)/sources/modules/imgproc/src/color.cpp
      $(OpenCV)/build/include/opencv2/imgproc/imgproc.hpp
      $(OpenCV)/build/include/opencv2/imgproc/types_c.h (色空間変換コードの定義)
  • 色空間変換コード一覧
    types_c.h で定義されているすべての色空間変換コード (2.4.9〜2.4.11 で確認). コードが定義されているすべての変換が実装されているかどうかは未確認.

    RGB(A) 系およびグレイスケール間の相互変換

    From\To BGR BGRA BGR565 BGR555 RGB RGBA GRAY
    BGR CV_BGR2BGRA CV_BGR2BGR565 CV_BGR2BGR555 CV_BGR2RGB CV_BGR2RGBA CV_BGR2GRAY
    BGRA CV_BGRA2BGR CV_BGRA2BGR565 CV_BGRA2BGR555 CV_BGRA2RGB CV_BGRA2RGBA CV_BGRA2GRAY
    BGR565 CV_BGR5652BGR CV_BGR5652BGRA - CV_BGR5652RGB CV_BGR5652RGBA CV_BGR5652GRAY
    BGR555 CV_BGR5552BGR CV_BGR5552BGRA - CV_BGR5552RGB CV_BGR5552RGBA CV_BGR5552GRAY
    RGB CV_RGB2BGR CV_RGB2BGRA CV_RGB2BGR565 CV_RGB2BGR555 CV_RGB2RGBA CV_RGB2GRAY
    RGBA CV_RGBA2BGR CV_RGBA2BGRA CV_RGBA2BGR565 CV_RGBA2BGR555 CV_RGBA2RGB CV_RGBA2GRAY
    GRAY CV_GRAY2BGR CV_GRAY2BGRA CV_GRAY2BGR565 CV_GRAY2BGR555 CV_GRAY2RGB CV_GRAY2RGBA

    RGBA ⇔ mRGBA (Premultiplied RGBA,事前乗算済アルファ) 双方向変換

    mRGBA
    RGBA CV_RGBA2mRGBA
    CV_mRGBA2RGBA

    (BGR,RGB) ⇔ (HLS, HSV, Lab, Luv, XYZ, YCrCb, YUV) 双方向変換

    HLS HSV Lab Luv XYZ YCrCb YUV
    BGR CV_BGR2HLS
    CV_HLS2BGR
    CV_BGR2HSV
    CV_HSV2BGR
    CV_BGR2Lab
    CV_Lab2BGR
    CV_BGR2Luv
    CV_Luv2BGR
    CV_BGR2XYZ
    CV_XYZ2BGR
    CV_BGR2YCrCb
    CV_YCrCb2BGR
    CV_BGR2YUV
    CV_YUV2BGR
    RGB CV_RGB2HLS
    CV_HLS2RGB
    CV_RGB2HSV
    CV_HSV2RGB
    CV_RGB2Lab
    CV_Lab2RGB
    CV_RGB2Luv
    CV_Luv2RGB
    CV_RGB2XYZ
    CV_XYZ2RGB
    CV_RGB2YCrCb
    CV_YCrCb2RGB
    CV_RGB2YUV
    CV_YUV2RGB

    (LBGR,LRGB) ⇔ (Lab, Luv) 双方向変換

    LRGB:輝度(Luminance)+RGB. アマチュア天文家が高画質モノクロ画像と低画質カラー画像から高画質カラー画像を作成するのに使用するらしい.

    Lab Luv
    LBGR CV_LBGR2Lab
    CV_Lab2LBGR
    CV_LBGR2Luv
    CV_Luv2LBGR
    LRGB CV_LRGB2Lab
    CV_Lab2LRGB
    CV_LRGB2Luv
    CV_Luv2LRGB

    入力専用フォーマット (YUV420(s)p)

    From\To BGR RGB BGRA RGBA GRAY
    YUV420p CV_YUV420p2BGR CV_YUV420p2RGB CV_YUV420p2BGRA CV_YUV420p2RGBA CV_YUV420p2GRAY
    YUV420sp CV_YUV420sp2BGR CV_YUV420sp2RGB CV_YUV420sp2BGRA CV_YUV420sp2RGBA CV_YUV420sp2GRAY

    入力専用フォーマット (Bayer)

    From\To BGR RGB BGR_VNG RGB_VNG GRAY
    BayerBG CV_BayerBG2BGR CV_BayerBG2RGB CV_BayerBG2BGR_VNG CV_BayerBG2RGB_VNG CV_BayerBG2GRAY
    BayerGB CV_BayerGB2BGR CV_BayerGB2RGB CV_BayerGB2BGR_VNG CV_BayerGB2RGB_VNG CV_BayerGB2GRAY
    BayerGR CV_BayerGR2BGR CV_BayerGR2RGB CV_BayerGR2BGR_VNG CV_BayerGR2RGB_VNG CV_BayerGR2GRAY
    BayerRG CV_BayerRG2BGR CV_BayerRG2RGB CV_BayerRG2BGR_VNG CV_BayerRG2RGB_VNG CV_BayerRG2GRAY

    出力専用フォーマット (HLS_FULL,HSV_FULL)

    From\To HLS_FULL HSV_FULL
    BGR CV_BGR2HLS_FULL CV_BGR2HSV_FULL
    RGB CV_RGB2HLS_FULL CV_RGB2HSV_FULL

    出力専用フォーマット (BGR_FULL,RGB_FULL)

    From\To BGR_FULL RGB_FULL
    HLS CV_HLS2BGR_FULL CV_HLS2RGB_FULL
    HSV CV_HSV2BGR_FULL CV_HSV2RGB_FULL

    出力専用フォーマット (YUV_I420,YUV_IYUV,YUV_UV12)

    From\To YUV_I420 YUV_IYUV YUV_YV12
    BGR CV_BGR2YUV_I420 CV_BGR2YUV_IYUV CV_BGR2YUV_YV12
    RGB CV_RGB2YUV_I420 CV_RGB2YUV_IYUV CV_RGB2YUV_YV12
    BGRA CV_BGRA2YUV_I420 CV_BGRA2YUV_IYUV CV_BGRA2YUV_YV12
    RGBA CV_RGBA2YUV_I420 CV_RGBA2YUV_IYUV CV_RGBA2YUV_YV12

    YUV からの出力専用フォーマット (YUV ⇒ p_q)

    qp BGR BGRA RGB RGBA GRAY
    IYUV CV_YUV2BGR_IYUV
    (YUV ⇒ BGR_IYUV)
    CV_YUV2BGRA_IYUV
    (YUV ⇒ BGRA_IYUV)
    CV_YUV2RGB_IYUV
    (YUV ⇒ RGB_IYUV)
    CV_YUV2RGBA_IYUV
    (YUV ⇒ RGBA_IYUV)
    CV_YUV2GRAY_IYUV
    (YUV ⇒ GRAY_IYUV)
    NV12 CV_YUV2BGR_NV12
    (YUV ⇒ BGR_NV12)
    CV_YUV2BGRA_NV12
    (YUV ⇒ BGRA_NV12)
    CV_YUV2RGB_NV12
    (YUV ⇒ RGB_NV12)
    CV_YUV2RGBA_NV12
    (YUV ⇒ RGBA_NV12)
    CV_YUV2GRAY_NV12
    (YUV ⇒ GRAY_NV12)
    NV21 CV_YUV2BGR_NV21
    (YUV ⇒ BGR_NV21)
    CV_YUV2BGRA_NV21
    (YUV ⇒ BGRA_NV21)
    CV_YUV2RGB_NV21
    (YUV ⇒ RGB_NV21)
    CV_YUV2RGBA_NV21
    (YUV ⇒ RGBA_NV21)
    CV_YUV2GRAY_NV21
    (YUV ⇒ GRAY_NV21)
    UYNV CV_YUV2BGR_UYNV
    (YUV ⇒ BGR_UYNV)
    CV_YUV2BGRA_UYNV
    (YUV ⇒ BGRA_UYNV)
    CV_YUV2RGB_UYNV
    (YUV ⇒ RGB_UYNV)
    CV_YUV2RGBA_UYNV
    (YUV ⇒ RGBA_UYNV)
    CV_YUV2GRAY_UYNV
    (YUV ⇒ GRAY_UYNV)
    UYVY CV_YUV2BGR_UYVY
    (YUV ⇒ BGR_UYVY)
    CV_YUV2BGRA_UYVY
    (YUV ⇒ BGRA_UYVY)
    CV_YUV2RGB_UYVY
    (YUV ⇒ RGB_UYVY)
    CV_YUV2RGBA_UYVY
    (YUV ⇒ RGBA_UYVY)
    CV_YUV2GRAY_UYVY
    (YUV ⇒ GRAY_UYVY)
    Y422 CV_YUV2BGR_Y422
    (YUV ⇒ BGR_Y422)
    CV_YUV2BGRA_Y422
    (YUV ⇒ BGRA_Y422)
    CV_YUV2RGB_Y422
    (YUV ⇒ RGB_Y422)
    CV_YUV2RGBA_Y422
    (YUV ⇒ RGBA_Y422)
    CV_YUV2GRAY_Y422
    (YUV ⇒ GRAY_Y422)
    YUNV CV_YUV2BGR_YUNV
    (YUV ⇒ BGR_YUNV)
    CV_YUV2BGRA_YUNV
    (YUV ⇒ BGRA_YUNV)
    CV_YUV2RGB_YUNV
    (YUV ⇒ RGB_YUNV)
    CV_YUV2RGBA_YUNV
    (YUV ⇒ RGBA_YUNV)
    CV_YUV2GRAY_YUNV
    (YUV ⇒ GRAY_YUNV)
    YUY2 CV_YUV2BGR_YUY2
    (YUV ⇒ BGR_YUY2)
    CV_YUV2BGRA_YUY2
    (YUV ⇒ BGRA_YUY2)
    CV_YUV2RGB_YUY2
    (YUV ⇒ RGB_YUY2)
    CV_YUV2RGBA_YUY2
    (YUV ⇒ RGBA_YUY2)
    CV_YUV2GRAY_YUY2
    (YUV ⇒ GRAY_YUY2)
    YUYV CV_YUV2BGR_YUYV
    (YUV ⇒ BGR_YUYV)
    CV_YUV2BGRA_YUYV
    (YUV ⇒ BGRA_YUYV)
    CV_YUV2RGB_YUYV
    (YUV ⇒ RGB_YUYV)
    CV_YUV2RGBA_YUYV
    (YUV ⇒ RGBA_YUYV)
    CV_YUV2GRAY_YUYV
    (YUV ⇒ GRAY_YUYV)
    YV12 CV_YUV2BGR_YV12
    (YUV ⇒ BGR_YV12)
    CV_YUV2BGRA_YV12
    (YUV ⇒ BGRA_YV12)
    CV_YUV2RGB_YV12
    (YUV ⇒ RGB_YV12)
    CV_YUV2RGBA_YV12
    (YUV ⇒ RGBA_YV12)
    CV_YUV2GRAY_YV12
    (YUV ⇒ GRAY_YV12)
    YVYU CV_YUV2BGR_YVYU
    (YUV ⇒ BGR_YVYU)
    CV_YUV2BGRA_YVYU
    (YUV ⇒ BGRA_YVYU)
    CV_YUV2RGB_YVYU
    (YUV ⇒ RGB_YVYU)
    CV_YUV2RGBA_YVYU
    (YUV ⇒ RGBA_YVYU)
    CV_YUV2GRAY_YVYU
    (YUV ⇒ GRAY_YVYU)
    I420 CV_YUV2BGR_I420
    (YUV ⇒ BGR_I420)
    CV_YUV2BGRA_I420
    (YUV ⇒ BGRA_I420)
    CV_YUV2RGB_I420
    (YUV ⇒ RGB_I420)
    CV_YUV2RGBA_I420
    (YUV ⇒ RGBA_I420)
    CV_YUV2GRAY_I420
    (YUV ⇒ GRAY_I420)
    420 - - - - CV_YUV2GRAY_420
    (YUV ⇒ GRAY_420)

閾値処理 (二値化,クランプなど)

double cv::threshold(InputArray src, OutputArray dst, double thresh, double maxValue, int thresholdType)
  • 機能
    グレイスケール画像を固定閾値で二値化またはクランプする.
  • 入力
    • src:入力配列 (CV_8[SU]C1,CV_32FC1).
    • thresh:閾値.
    • maxValue:二値化の出力レベル.
    • thresholdType:閾値処理の種類.
      thresholdType dst(x, y) 説明
      THRESH_BINARY 0 (src(x, y) > thresh) ? maxValue : 0 二値化 (非反転)
      THRESH_BINARY_INV 1 (src(x, y) > thresh) ? 0 : maxValue 二値化 (反転)
      THRESH_TRUNC 2 min(src(x, y), thresh) 上限クランプ
      THRESH_TOZERO 3 (src(x, y) > thresh) ? src(x, y) : 0 過小値除外 (足切り)
      THRESH_TOZERO_INV 4 (src(x, y) > thresh) ? 0 : src(x, y) 過大値除外
      THRESH_OTSU 8 - このフラグを上記のいずれかと "|" で組み合わせると,
      大津の方法を用いて閾値を自動的に決定し,戻り値として返す.
      (現時点では 8bit 画像のみ使用可能.)
  • 出力
    • dst:出力配列.src と同じサイズおよび型.
  • 戻り値:THRESH_OTSU フラグを指定した場合,自動決定した閾値を返す.
  • 参考
    • threshold (本家マニュアル)
    • サンプルコード:$(OpenCV)/sources/samples/cpp/tutorial_code/ImgProc/Threshold.cpp
      グレイスケール画像をウインドウに表示し,2つのスライダーで thresh と thresholdType を操作することができる.
void cv::adaptiveThreshold(InputArray src, OutputArray dst, double maxValue, int adaptiveMethod, int thresholdType, int blockSize, double C)
  • 機能
    グレイスケール画像を適応的二値化する.
  • 入力
    • src:入力配列 (CV_8[SU]C1).
    • maxValue:二値化の出力レベル.
    • adaptiveMethod:適応アルゴリズム.画素 src(x, y) の閾値 T(x, y) は,(x, y) を中心とする正方形ブロック内の画素値の加重平均から計算する.
      adaptiveMethod T(x, y)
      ADAPTIVE_THRESH_MEAN_C (ブロックの平均 (矩形窓)) − C
      ADAPTIVE_THRESH_GAUSSIAN_C (ブロックの加重平均 (ガウス窓)) − C
    • thresholdType:閾値処理の種類.
      thresholdType dst(x, y) 説明
      THRESH_BINARY (src(x, y) > T(x, y)) ? maxValue : 0 二値化 (非反転)
      THRESH_BINARY_INV (src(x, y) > T(x, y)) ? 0 : maxValue 二値化 (反転)
    • blockSize:正方形ブロックの一辺の画素数.3以上の奇数でなければならない.
    • C:ブロックの (加重) 平均から減算する定数 (普通は正の値).
  • 出力
    • dst:出力配列.src と同じサイズおよび型.
  • 参考

画像フィルタ

void cv::blur(InputArray src, OutputArray dst, Size ksize, Point anchor = Point(-1,-1), int borderType = BORDER_DEFAULT)
  • 機能:矩形領域で単純平均化するフィルタ.
  • 入力
    • src:入力画像.チャネル数は任意で,それぞれ独立に処理される.
      深度は次のいずれか:CV_8U,CV_16[US],CV_32F,CV_64F.
    • ksize:フィルタの積分核 (kernel) のサイズ.
    • anchor:積分核の基準位置 (anchor) を指定する.(-1, -1) は 核の中心を意味する.
    • borderType:積分核が画像の端からはみ出す場合の画素の外挿方法を指定する.(borderInterpolate() 参照)
  • 出力
    • dst:出力画像.サイズおよび種別は src と同じ.
  • 参考
    • blur (本家マニュアル)
    • ソース
      $(OpenCV)/sources/modules/imgproc/src/smooth.cpp
      $(OpenCV)/build/include/opencv2/imgproc/imgproc.hpp
    • サンプルコード
      $(OpenCV)/sources/samples/cpp/tutorial_code/ImgProc/Smoothing.cpp
void cv::Sobel(InputArray src, OutputArray dst, int ddepth, int orderX, int orderY, int ksize = 3, double scale = 1, double delta = 0, int borderType = BORDER_DEFAULT)
  • 機能:拡張 Sobel 演算子を用いて画像の偏微分画像 (1〜3階または混合) を計算する.
  • 入力
    • src:入力画像.
    • ddepth:出力画像の深度.可能な値は src.depth() に依存する.
      src.depth() ddepth (-1:src と同じ)
      CV_8U -1 / CV_16S / CV_32F / CV_64F
      CV_16[US]
      CV_32F
      -1 / CV_32F / CV_64F
      CV_64F -1 / CV_64F
    • orderX,orderY:それぞれX方向およびY方向微分の階数.
      出力画像は ∂orderX+orderYsrc / ∂xorderX ∂yorderY に相当する.
      普通は (orderX=1,orderY=0,ksize=3) または (orderX=0,orderY=1,ksize=3) を使用する.
    • ksize:拡張 Sobel フィルタのカーネルサイズ.
      • 1, 3, 5, 7(=CV_MAX_SOBEL_KSIZE),CV_SCHARR(=-1) のいずれかでなければならない.ksize=3 の場合,X方向微分用カーネルは次のとおり.
        -1 0 +1
        -2 0 +2
        -1 0 +1
      • ksize=1 は1階または2階微分の場合に限り使用可能.この場合 3×1 または 1×3 のカーネルを使用し,Gauss 平滑は行わない.
      • ksize=CV_SCHARR の場合,3×3 Sobel より (角度が) 正確な Scharr フィルタを使用する.X方向微分のカーネルは次のとおり.
        -3 0 +3
        -10 0 +10
        -3 0 +3
    • scale:偏微分係数に乗算される倍率.
    • delta:出力画像の各画素に加算されるオフセット.
    • borderType:入力画像の端の補外方法.(borderInterpolate() 参照)
  • 出力
    • dst:出力画像.サイズおよびチャネル数は src と同じ.
      dst(x,y) formula
  • 参考
    • Sobel (本家マニュアル)
    • Scharr (本家マニュアル)
    • ソース
      $(OpenCV)/sources/modules/imgproc/src/deriv.cpp
      $(OpenCV)/build/include/opencv2/imgproc/imgproc.hpp
    • サンプルコード
      $(OpenCV)/sources/samples/cpp/tutorial_code/ImgTrans/Sobel_Demo.cpp
void cv::Scharr(InputArray src, OutputArray dst, int ddepth, int orderX, int orderY, double scale = 1, double delta = 0, int borderType = BORDER_DEFAULT)
  • 機能:Scharr 演算子を用いて画像の (1階) 偏微分画像を計算する.
    cv::Scharr(src, dst, ddepth, dx, dy, scale, delta, borderType);
    
    は,
    cv::Sobel(src, dst, ddepth, dx, dy, CV_SCHARR, scale, delta, borderType);
    
    と同じ.(cv::Sobel 参照)
  • 参考
    • Sobel operator (Wikipedia 英語版)
      ⇒ Alternative operators
      (抄訳) Scharr は,Sobel-Feldman 演算子が完全な回転対称性を持たない問題を研究した.Scharr フィルタは空間周波数領域における角度の加重平均二乗誤差を最小にする (らしい).
void cv::bilateralFilter(InputArray src, OutputArray dst, int diameter, double sigmaColor, double sigmaSpace, int borderType = BORDER_DEFAULT)
  • 機能:バイラテラルフィルタ.エッジをかなり残したままノイズを除去することができる. (しかしほとんどのフィルタに比べて非常に遅い.)
  • 入力
    • src:入力画像.
      • 深度:CV_8U または CV_32F のみ (内部実装で確認).
      • チャネル数:1 または 3 のみ (内部実装で確認).
    • diameter:画素近傍の直径.0以下の値を指定した場合は (sigmaSpace * 3) とする (内部実装で確認).diameter>5 だと非常に遅い.リアルタイム処理では diameter=5 を推奨.ノイズが多い画像を (非リアルタイム) 処理する場合はおそらく diameter=9 程度が良い.
    • sigmaColor:近傍画素との輝度差に対する正規分布のσ (エッジを保存するため,輝度差が大きい近傍画素の重みを小さくする). 0以下の値を指定した場合は1とする (内部実装で確認).
    • sigmaSpace:通常のガウスフィルタ (cv::GaussianBlur()) のσと同じ.0以下の値を指定した場合は1とする (内部実装で確認).
    • borderType:フィルタ核が画像の端からはみ出す場合の画素の外挿方法を指定する.(borderInterpolate() 参照)
  • 出力
    • dst:出力画像.サイズおよび種別は src と同じ.
  • 参考
    • bilateralFilter (本家マニュアル)
    • 元論文:C. Tomasi, R. Manduchi, Bilateral Filtering for Gray and Color Images, Proc. of 1998 IEEE International Conference on Computer Vision. (PDF要約版HTML)
    • Bilateral filter (Wikipedia 英)
    • ソース
      $(OpenCV)/sources/modules/imgproc/src/smooth.cpp
      $(OpenCV)/build/include/opencv2/imgproc/imgproc.hpp

モルフォロジー

void cv::dilate(InputArray src, OutputArray dst, InputArray kernel, Point anchor = Point(-1, -1), int iterations = 1, int borderType = BORDER_CONSTANT, const Scalar &borderValue = cv::morphologyDefaultBorderValue( ))
  • 機能
    構造化要素を用いて膨張処理を行う.
    • 書き換え (in-place) モードをサポートする.つまり src と別に dst を用意せずに src を直接書き替えることが可能.
      参考:【OpenCV】インプレースモード (イメージングソリューション)
    • マルチチャネル画像の場合,各チャネルは独立に処理される.
  • 入力
    • src:入力画像 (CV_8U,CV_16[SU],CV_32F,CV_64F).チャネル数は任意.
    • kernel:構造化要素.kernel=Mat() の場合は 3×3 の正方形を使用する.
    • anchor:kernel 内の基準位置 (anchor) を指定する.(-1, -1) ならば kernel の中心.
    • iterations:膨張演算の繰り返し回数.
    • borderType:境界画素の外挿方法.(borderInterpolate() 参照)
    • borderValue:borderType=BORDER_CONSTANT の場合に使用する画素値. (createMorphologyFilter( ) 参照.)
  • 出力
    • dst:出力画像.サイズと型は src と同じ.
      (iterations=0 または kernel が 1×1 の場合はモルフォロジー演算の必要がないので単なる src のコピー.)
  • 参考
    • dilate (本家マニュアル)
    • ソース
      $(OpenCV)/sources/modules/imgproc/src/morph.cpp
      $(OpenCV)/build/include/opencv2/imgproc/imgproc.hpp
    • サンプルコード:$(OpenCV)/sources/samples/cpp/tutorial_code/ImgProc/Morphology_1.cpp
      画像をウインドウに表示し,2つのスライダーで構造化要素の形と大きさを操作することができる.
void cv::erode(InputArray src, OutputArray dst, InputArray kernel, Point anchor = Point(-1, -1), int iterations = 1, int borderType = BORDER_CONSTANT, const Scalar &borderValue = cv::morphologyDefaultBorderValue( ))
  • 機能
    構造化要素を用いて収縮処理を行う.
    • 書き換え (in-place) モードをサポートする.つまり src と別に dst を用意せずに src を直接書き替えることが可能.
    • マルチチャネル画像の場合,各チャネルは独立に処理される.
  • 入力
    • src:入力画像 (CV_8U,CV_16[SU],CV_32F,CV_64F).チャネル数は任意.
    • kernel:構造化要素.kernel=Mat() の場合は 3×3 の正方形を使用する.
    • anchor:kernel 内の基準位置 (anchor) を指定する.(-1, -1) ならば kernel の中心.
    • iterations:膨張演算の繰り返し回数.
    • borderType:境界画素の外挿方法.(cv::dilate( ) 参照)
    • borderValue:borderType=BORDER_CONSTANT の場合に使用する画素値. (createMorphologyFilter( ) 参照.)
  • 出力
    • dst:出力画像.サイズと型は src と同じ.
      (iterations=0 または kernel が 1×1 の場合はモルフォロジー演算の必要がないので単なる src のコピー.)
  • 参考
    • erode (本家マニュアル)
    • ソース
      $(OpenCV)/sources/modules/imgproc/src/morph.cpp
      $(OpenCV)/build/include/opencv2/imgproc/imgproc.hpp
    • サンプルコード:$(OpenCV)/sources/samples/cpp/tutorial_code/ImgProc/Morphology_1.cpp
      画像をウインドウに表示し,2つのスライダーで構造化要素の形と大きさを操作することができる.
void cv::morphologyEx(InputArray src, OutputArray dst, int op, InputArray kernel, Point anchor = Point(-1, -1), int iterations = 1, int borderType = BORDER_CONSTANT, const Scalar &borderValue = cv::morphologyDefaultBorderValue( ))
  • 機能
    高度なモルフォロジー変換を行う.
  • 入力
    • src:入力画像 (CV_8U,CV_16[SU],CV_32F,CV_64F).チャネル数は任意.
    • op:モルフォロジー演算の種類.
      op 定義式 説明
      MORPH_OPEN 2 open ≡ dilate ∘ erode オープニング演算 ("∘":合成関数)
      MORPH_CLOSE 3 close ≡ erode ∘ dilate クロージング演算 ("∘":合成関数)
      MORPH_GRADIENT 4 morph_grad ≡ dilate - erode モルフォロジー勾配
      MORPH_TOPHAT 5 tophat ≡ I - open トップハット演算 (I:恒等変換)
      MORPH_BLACKHAT 6 blackhat ≡ close - I ブラックハット演算 (I:恒等変換)
      • どの演算も書き換え (in-place) モードをサポートする.つまり src と別に dst を用意せずに src を直接書き替えることが可能.
      • マルチチャネル画像の場合,各チャネルは独立に処理される.
    • kernel:構造化要素.
    • anchor:kernel 内の基準位置 (anchor) を指定する.(-1, -1) ならば kernel の中心.
    • iterations:膨張演算の繰り返し回数.
    • borderType:境界画素の外挿方法.(cv::dilate( ) 参照)
    • borderValue:borderType=BORDER_CONSTANT の場合に使用する画素値. (createMorphologyFilter( ) 参照.)
  • 出力
    • dst:出力画像.サイズと型は src と同じ.
      (iterations=0 または kernel が 1×1 の場合はモルフォロジー演算の必要がないので単なる src のコピー.)
  • 参考
    • morphologyEx (本家マニュアル)
    • サンプルコード:$(OpenCV)/sources/samples/cpp/tutorial_code/ImgProc/Morphology_2.cpp
      画像をウインドウに表示し,3つのスライダーで演算の種類および構造化要素の形と大きさを操作することができる.
static inline cv::Scalar cv::morphologyDefaultBorderValue()
  • 機能:膨張 (dilate) または収縮 (erode) の処理において,画像の外側の境界画素を使用しないようにするための値を返す.
  • 戻り値:cv::Scalar::all(DBL_MAX). この値は膨張処理では−∞,収縮処理では+∞と解釈され, 画像に含まれる画素だけで膨張・収縮処理が行われる.
  • 参考
    • createMorphologyFilter (本家マニュアル)
    • ソース
      $(OpenCV)/build/include/opencv2/imgproc/imgproc.hpp

画像の幾何学的変換

void cv::resize(InputArray src, OutputArray dst, Size dsize, double fx = 0, double fy = 0, int interpolation = INTER_LINEAR)
  • 機能:画像をリサイズする.
  • 入力
    • src:入力画像.
    • dsize:出力画像サイズ.0を指定した場合は dsize = Size(round(fx * src.cols), round(fy * src.cols)).
      dsize≠0 または (fx≠0 && fy≠0) でなければならない.
    • fx:横方向の倍率.0を指定した場合は (double)dsize.width / src.cols を使用する.
    • fy:縦方向の倍率.0を指定した場合は (double)dsize.height / src.rows を使用する.
    • interpolation:補間法.cv::warpAffine( ) の補間法 (INTER_*) を参照 (WARP_INVERSE_MAP は使用不可).
  • 出力
    • dst:出力画像.サイズは dsize≠0 ならば dsize,そうでなければ src.Size(),fx,fy から計算する.種別は src と同じ.(dst の元のサイズと種別は無視される.)
  • 使用例
    • 現在の dst のサイズを変更せずに src をリサイズする.
      cv::resize(src, dst, dst.size(), 0, 0, interpolation);
      
    • 縦横とも 1/2 に縮小する.
      cv::resize(src, dst, cv::Size(), 0.5, 0.5, interpolation);
      
  • 参考
    • resize (本家マニュアル)
void cv::warpAffine(InputArray src, OutputArray dst, InputArray M, Size dsize, int flags = INTER_LINEAR, int borderMode = BORDER_CONSTANT, const Scalar &borderValue = Scalar())
  • 機能:画像にアフィン変換を適用する.
  • 入力
    • src:入力画像.
    • M:アフィン変換行列 (2×3).
    • dsize:出力画像のサイズ.
    • flags:補間法 (INTER_*) とオプションフラグ (WARP_INVERSE_MAP) の組み合わせ.
      op 説明
      INTER_NEAREST
      (CV_INTER_NN)
      0 最近傍補間 (Nearest Neighbor)
      INTER_LINEAR
      (CV_INTER_LINEAR)
      1 双線型補間 (Bilinear Interpolation).
      画像を拡大する場合に適している.画質は INTER_CUBIC の方が良いが,こちらの方が速い.
      INTER_CUBIC
      (CV_INTER_CUBIC)
      2 4×4近傍を用いて双3次補間 (Bicubic Interpolation) する.
      画像を拡大する場合に適しているが,遅い.
      INTER_AREA
      (CV_INTER_AREA)
      3 画素の面積の関係 (relation (比?)) に基づいて再サンプリングする.一般に,画像を縮小する場合に適している.特に画像を大幅に縮小する場合はモアレが発生しないので好ましい.しかし画像を拡大する場合は INTER_NEAREST と同様.
      INTER_LANCZOS4
      (CV_INTER_LANCZOS4)
      4 8×8近傍を用いて Lanczos 補間する.
      WARP_INVERSE_MAP
      (CV_WARP_INVERSE_MAP)
      16 M の逆変換を使用する.
    • borderMode:画素の外挿方法 (cv::borderInterpolate() 参照).
  • 出力
    • dst:出力画像.型は src と同じ.サイズは dsize.
  • 参考
cv::Mat cv::getRotationMatrix2D(cv::Point2f center, double angle, double scale)
  • 機能:2次元の回転 (および拡大・縮小) アフィン変換行列を計算する.
  • 入力
    • center:回転および拡大・縮小の中心.座標系の原点は画像の左上隅.(注意:Y軸は下向き.)
    • angle:回転角 ().反時計方向が正.(注意:座標軸に対して逆回り.)
    • scale:拡大率.
  • 戻り値:アフィン変換行列 (2×3,CV_64F).

特徴抽出

void cv::Canny(InputArray src, OutputArray edges, double threshold1, double threshold2, int apertureSize = 3, bool L2gradient = false)
  • 機能:[Canny86] のアルゴリズムを用いてエッジ検出を行う.
  • 入力
    • src:入力グレイスケール画像 (CV_8UC1).
      (マニュアルには "single-channel" と書かれているが,内部実装は複数チャネルに対応しているようである. ただしチャネルごとに作成した微分画像から, 勾配ノルムが最大となるチャネルを画素ごとに選択するようになっているので, 実用上うまくエッジ検出できるのかどうか疑問.)
    • threshold1,threshold2:ヒステリシスの閾値.
      • 輝度勾配のノルムが大きい方の閾値を超える画素 (強いエッジ,strong edge) を発見すると,新しいエッジの追跡を開始する.(エッジは4方向 (45°単位))
      • 追跡中のエッジの輝度勾配のノルムが小さい方の閾値以下になると追跡を終了する.
    • apertureSize:cv::Sobel フィルタのカーネルサイズ (正方形の一辺の画素数 (3, 5, 7) または CV_SCHARR のいずれか).
      (2.4.9 の内部実装では,境界画素の補外は BORDER_REPLICATE を使用している.)
    • L2gradient:画像の輝度 I(x, y) の勾配 (gradient) の強さ (ノルム) の計算式を選択する.
      • true の場合:L2 (ユークリッド) ノルム |∇I| = √((∂I/∂x)2+(∂I/∂y)2) を使用する.正確だがやや遅い.
      • false の場合:L1 ノルム |∂I/∂x|+|∂I/∂y| を使用する.普通はこちらで十分.
        (理論的には,±45°のエッジの L1 ノルムは 0°および 90°の場合の√2倍になるので,
        水平・垂直線よりも斜めの線の方がやや検出されやすくなるはず.)
  • 出力
    • edges:エッジ画像.src と同じサイズおよび種別 (CV_8UC1).
  • 注意
    • メモリ使用量:処理中は src と edges 以外に,src の5倍以上のメモリを必要とする.(2.4.9 の内部実装)
      (∂I/∂x,∂I/∂y の画像 (どちらも CV_16S) で合計 src の4倍,バッファで src の 1ch 分以上.)
  • 参考
    • Canny (本家マニュアル)
    • Canny Edge Detector (OpenCV.org)
    • ソース
      $(OpenCV)/sources/modules/imgproc/src/canny.cpp
      $(OpenCV)/build/include/opencv2/imgproc/imgproc.hpp
    • サンプルコード
      $(OpenCV)/sources/samples/cpp/tutorial_code/ImgTrans/CannyDetector_Demo.cpp
      $(OpenCV)/sources/samples/cpp/edge.cpp
      $(OpenCV)/sources/modules/imgproc/test/test_canny.cpp (GoogleTest 用テストコードらしい)
    • [Canny86] J. Canny. A Computational Approach to Edge Detection, IEEE Trans. on Pattern Analysis and Machine Intelligence, 8(6), pp. 679-698 (1986).
    • Canny edge detector (Wikipedia 英語版)
    • コンピュータビジョン特論 第5回 (呉 海元,和歌山大学)
      Canny Edge Detector ほか.
void cv::HoughCircles(InputArray image, OutputArray circles, int method, double dp, double minDist, double param1 = 100, double param2 = 100, int minRadius = 0, int maxRadius = 0)
  • 機能
    Hough 変換を用いてグレイスケール画像から円を検出する.
  • 入力
    • image:入力画像 (グレイスケール,8bit,1ch).
    • method:検出方法.現時点で実装されているのは CV_HOUGH_GRADIENT のみ.
    • dp:画像サイズに対する Accumulator のサイズの逆比.Accumulator の幅および高さは入力画像の幅および高さの 1/dp.
    • minDist:検出する円の中心同士の最小距離. この値が小さすぎると,実在する円の近くに多数の円が誤検出される可能性がある. 逆に大きすぎると円を見落とす場合がある.
    • param1,param2:method 固有のパラメータ.CV_HOUGH_GRADIENT の場合,param1 はエッジ検出器 Canny( ) に渡される上側閾値 (下側はその半分),param2 は accumulator 閾値.param2 を小さくするほど誤検出する可能性が高くなる.
    • minRadius,maxRadius:円の半径の範囲.
  • 出力
    • circles:検出した円の配列.各要素は Vec3f(x, y, radius).
  • 参考

未分類

int cv::borderInterpolate(int position, int length, int borderType)
  • 機能:補外すべき画素の位置から,コピー元の画素の位置を求める.つまり1次元画像 p[0],p[1],…,p[length-1] を補外して p[position] (position<0 または position≧length) を求めたい場合,この関数が返した値が i (0≦i<length) ならば,p[position] は p[i] をコピーしたものとなる.
                 ←───── 補外前の1次元画像 ─────→
    ┌─┬ … ─┳━━┳━━┳ … ┳━━┳ … ┳━━━━━━┳ … ┬──────┬ …
    │  │      ┃p[0]┃p[1]┃    ┃p[i]┃    ┃p[length-1] ┃    │p[position] │
    └─┴ … ─┻━━┻━━┻ … ┻━━┻ … ┻━━━━━━┻ … ┴──────┴ …
                                     │                                  ↑
                                     └─────────────────┘
                                                 補外 (コピー)
    
  • 入力
    • position:外挿する画素の位置 (1次元座標).
    • length:補外に使用する1次元画像の長さ.
    • borderType:境界画素の外挿方法.(BORDER_TRANSPARENT と BORDER_ISOLATED は不可.)
      borderType 外挿パターン 説明
      BORDER_REPLICATE 1 aaaaaa|abcdefgh|hhhhhhh 境界画素を延長 (反復使用) する.
      BORDER_REFLECT 2 fedcba|abcdefgh|hgfedcb 境界画素の端で鏡映.
      BORDER_REFLECT_101
      BORDER_REFLECT101
      BORDER_DEFAULT
      4 gfedcb|abcdefgh|gfedcba 境界画素の中心で鏡映.
      BORDER_WRAP 3 cdefgh|abcdefgh|abcdefg 画像全体を繰り返す.(トーラスと同相)
      BORDER_CONSTANT 0 iiiiii|abcdefgh|iiiiiii 指定された値 i=borderValue で延長する.
      borderInterpolate( ) は常に -1 を返す.
  • 戻り値:補外に使用するコピー元画素の位置座標 (上図の i).ただし BORDER_CONSTANT の場合は常に -1 を返す.
  • ソースファイル
    $(OpenCV)/build/include/opencv2/imgproc/imgproc.hpp
    $(OpenCV)/sources/modules/imgproc/src/filter.cpp
  • 参考
void cv::reduce(InputArray src, OutputArray dst, int dim, int rtype, int dtype = -1)
  • 機能:行列をベクトルに縮約する.多チャンネル行列も使用可能.
  • 入力
    • src:入力行列 (2D).
    • dim:縮約する src の次元の番号.
      • 0:src の各列を縮約して単一行にする.
      • 1:src を各行を縮約して単一列にする.
    • rtype:縮約演算.
      rtype 説明 備考
      CV_REDUCE_SUM 0 合計 dst には src より大きなビット深度が必要.
      CV_REDUCE_AVG 1 平均
      CV_REDUCE_MAX 2 最大値 dst のビット深度は src と同等以上.
      CV_REDUCE_MIN 3 最小値
    • dtype:dst のビット深度 (CV_8U,CV_32F など) を指定する.dtype≧0 ならば dst の種別は CV_MAKE_TYPE(CV_MAT_DEPTH(dtype), src.channels()), dtype<0 ならば src と同じ.
  • 出力
    • dst:出力ベクトル.サイズと種別は dim と dtype で指定される.
  • ソースファイル
    $(OpenCV)/include/opencv2/core/core.hpp
    $(OpenCV)/sources/modules/core/src/matrix.cpp
  • 参考
    • reduce (本家マニュアル)
void cv::flip(InputArray src, OutputArray dst, int flipCode)
  • 機能:2D 行列を上下 / 左右 / 両方 (=180°回転) 反転させる.
  • 入力
    • src:入力行列 (2D).
    • flipCode:
      flipCode の符号 dst(y, x) 説明
      + src(y, src.cols - 1 - x) 左右反転
      0 src(src.rows - 1 - y, x) 上下反転
      - src(src.rows - 1 - y, src.cols - 1 - x) 上下および左右反転 (=180°回転)
  • 出力
    • dst:出力行列.サイズと種別は src と同じ.
  • ソースファイル
    $(OpenCV)/sources/modules/core/include/opencv2/core/core.hpp
    $(OpenCV)/sources/modules/core/src/copy.cpp
  • 参考
    • flip (本家マニュアル)
void cv::convexHull(InputArray points, OutputArray hull, bool clockwise = false, bool returnPoints = true)
  • 機能:点集合の凸包を求める.(Sklansky のアルゴリズムを使用.計算量は O(N log(N)).
  • 入力
    • points:入力点集合 (2D,std::vector<cv::Point> または cv::Mat).
    • clockwise:凸包の点列の回転方向 (true ⇔ 時計回り).
      注意:この回転方向はX軸が右向き,Y軸が上向きの場合なので, 普通の画像座標 (Y軸が下向き) では逆回転となる.
    • returnPoints:hull の説明を参照.
  • 出力
    • hull:凸包.
      • returnPoints=true の場合:点のベクタ (std::vector<cv::Point>)
      • returnPoints=false の場合:points のインデックスのベクタ (std::vector<int>).
  • 参考
    • convexHull (本家マニュアル)
    • サンプルコード:$(OpenCV)/sources/samples/cpp/convexhull.cpp
      キーを押すたびにランダムに発生させた点集合の凸包を計算してウインドウに表示する. ESC,'Q','q' のいずれかを押すと終了する.
    • Sklansky, J., Finding the Convex Hull of a Simple Polygon. Pattern Recognition Letters, Vol.1, pp 79-83 (1982)
void cv::findContours(InputOutputArray image, OutputArrayOfArrays contours, OutputArray hierarchy, int mode, int method, Point offset = Point())
  • 機能:二値画像の輪郭を抽出する.
  • 入力
    • mode:輪郭抽出モード.
      mode 説明
      CV_RETR_EXTERNAL 0 最も外側の (extreme outer) 輪郭. (閉じていない輪郭線は無視される?)
      CV_RETR_LIST 1 階層関係を無視してすべての輪郭線を抽出する.
      CV_RETR_CCOMP 2 すべての輪郭線を2レベルの階層に組織化する.
      1. 上位レベル (top level):領域の (外側の) 境界線.
      2. 下位レベル (second level):領域に穴が空いている場合,その穴の境界線.穴の中にも領域がある場合 (例:湖の中の島),その外側輪郭は上位レベルに属する.
      CV_RETR_TREE 3 すべての輪郭線を木構造に組織化する. 親子関係は入れ子になっている輪郭線を表す. 親は閉じた輪郭線,子はその内側にある輪郭線.

    • method:輪郭線近似方法.
      method 説明
      CV_CHAIN_APPROX_NONE 1 すべての輪郭点を取得する.隣接する2つの輪郭点について,一方は他方の8近傍の一つである.
      CV_CHAIN_APPROX_SIMPLE 2 CV_CHAIN_APPROX_NONE で得られた輪郭線で,同じ方向 (0°,90°,±45°) の線分が連続する部分を一つにまとめたもの.
      → 隣接する輪郭点を結ぶ線分は必ず上記の4つの角度のみで,隣接する線分の角度は必ず異なる.
      CV_CHAIN_APPROX_TC89_L1 3 Teh-Chin 風の近似アルゴリズムを使用する.(詳細未調査)
      CV_CHAIN_APPROX_TC89_KCOS 4

    • offset:輪郭線上の各点に加算するオフセット.ROI から輪郭線を抽出し,画像全体の中で解析する場合に有用.
  • 入出力
    • image:入力画像 (CV_8[SU]C1).0以外の画素は1と見なして二値画像として扱う.
      この画像は書き替えられる点に注意.
  • 出力
    • contours:抽出した輪郭.各輪郭線は点のベクタとして格納される.
      • 輪郭線が閉曲線の場合,最後の点は最初の点と同じではなく, 一つ手前の点らしい.(実験で確認)
    • hierarchy:画像のトポロジー情報 (オプション).輪郭線と同数の要素からなるベクタ. i番目の輪郭線 contours[i] には次の要素が対応する (該当する要素がなければ負の値).
      • hierarchy[i][0]:次の兄弟輪郭線のインデックス.
      • hierarchy[i][1]:直前の兄弟輪郭線のインデックス.
      • hierarchy[i][2]:最初の子輪郭線のインデックス.
      • hierarchy[i][3]:親輪郭線のインデックス.
  • 参考
void cv::fitLine(InputArray points, OutputArray line, int distType, double param, double reps, double aeps)
  • 機能:2D または 3D の点集合に直線を当てはめる.
  • 入力
    • points:2D または 3D の点集合 (std::vector<> または cv::Mat,CV_32[FS]).
    • distType:M推定法 (M-estimator) で使用する距離の種別.
      distType 距離関数 説明
      CV_DIST_L2 2 ρ(r) ≡ r2/2 最も単純・高速な最小二乗法.
      CV_DIST_L1 1 ρ(r) ≡ r
      CV_DIST_L12 4 ρ(r) ≡ 2 (√(1 + r2/2) - 1)
      CV_DIST_FAIR 5 ρ(r) ≡ C2・(r/C - log(1 + r/C))
      (C=1.3998)

      CV_DIST_WELSCH 6 ρ(r) ≡ (C2/2)・(1 - exp(-(r/C)2))
      (C=2.9846)

      CV_DIST_HUBER 7 ρ(r) ≡ (r < C) ? (r2/2) : C・(r - C/2)
      (C=1.345)

    • param:いくつかの距離関数で使用する数値パラメータ C.
    • reps:半径 (座標原点と直線の距離) の許容誤差.(0.01 は妥当なデフォルト値.)
    • aeps:角度の許容誤差.(0.01 は妥当なデフォルト値.)
  • 出力
    • line:直線のパラメータ.
      • 2D の場合:(vx, vy, x0, y0).
        (vx, vy):直線に平行な単位ベクトル.
        (x0, y0):直線上の一点.
      • 3D の場合:(vx, vy, vz, x0, y0, z0).
        (vx, vy, vz):直線に平行な単位ベクトル.
        (x0, y0, z0):直線上の一点.
  • 処理 (推測,要確認)
    1. 最初に普通の最小二乗法で回帰直線を求める.
    2. 各点 points[i] と直線の距離 ri を求める.
    3. distType で指定された距離の逆数を重みとして,重み付き最小二乗法で回帰直線を求める.
    4. 直線パラメータの誤差が reps および aeps 以下になるまで 2〜3 を繰り返す.
  • ソースファイル
    $(OpenCV)/include/opencv2/imgproc/imgproc.hpp
    $(OpenCV)/sources/modules/imgproc/src/contours.cpp
  • 参考
RotatedRect cv::minAreaRect(InputArray points)
  • 機能:指定された点集合を囲む面積最小の (通常は傾いた) 矩形を求める.
  • 入力
    • points:2次元の点の集合 (CV_32[SF]).
  • 戻り値:上記の矩形.
    (注意:points が座標軸近くの点を含んでいれば,矩形四隅の座標に負の値が含まれる可能性がある.)
  • ソースファイル
    $(OpenCV)/include/opencv2/imgproc/imgproc.hpp
    $(OpenCV)/sources/modules/imgproc/src/contours.cpp
    $(OpenCV)/sources/modules/imgproc/src/rotcalipers.cpp (cvMinAreaRect2( ))
  • 参考
void cv::matchTemplate(InputArray image, InputArray templ, OutputArray result, int method)
  • 機能:テンプレートマッチングを行う.(探索対象画像の中でテンプレート画像を移動させながら類似度の分布を計算する.)
  • 入力
    • image:探索対象画像 (size:W×H,depth:CV_8U or CV_32F).
    • templ:テンプレート画像 (size:w×h).
      • w≦W,h≦H でなければならない.
      • type は image と同じでなければならない.
    • method:類似度の計算方法.
      • CV_TM_SQDIFF(=0):画素値の差の二乗和
      • CV_TM_SQDIFF_NORMED(=1):画素値の差の二乗和 (正規化)
      • CV_TM_CCORR(=2):相関関数
      • CV_TM_CCORR_NORMED(=3):正規化相関関数
      • CV_TM_CCOEFF(=4):共分散
      • CV_TM_CCOEFF_NORMED(=5):相関係数
  • 出力
    • result:比較結果 (類似度) の行列 (size:(W−w+1)×(H−h+1),CV_32F).
  • ソースファイル
    $(OpenCV)/include/opencv2/imgproc/imgproc.hpp
    $(OpenCV)/sources/modules/imgproc/src/templmatch.cpp
  • 参考

HighGUI

未分類

int cv::waitKey(int delay = 0)
int cvWaitKey(int delay)
  • 機能:キーが押されるのを待つ.この関数は1つ以上の HighGUI ウインドウがアクティブの場合に限り動作する.

    これは単にキー入力を待つだけの関数ではなく,実際には GUI のイベントループ (Windows ではメッセージループ) であり,HighGUI で唯一のイベント処理関数である.(例えばヒストグラムのサンプル demhist.cpp を参照.)

  • 入力
    • delay:最大待ち時間 (単位:ms).delay≦0 の場合は∞とみなす.
  • 戻り値:押されたキーのコード.タイムアウトした場合は -1.
  • ソースファイル
    $(OpenCV)/sources/modules/highgui/src/
    • window.cpp
      cv::waitKey( ) は cvWaitKey( ) を呼び出すだけ.ここにある cvWaitKey( ) の実装はダミー.
    • window_w32.cpp (Win32 用 cvWaitKey( ))
    • window_gtk.cpp (GTK 用 cvWaitKey( ))
    • window_QT.cpp (Qt 用 cvWaitKey( ))
    • window_carbon.cpp (Carbon 用 cvWaitKey( ))
    • window_cocoa.mm (Cocoa 用 cvWaitKey( ))
  • 参考

cv::Mat

cv::Mat のメンバ

int flags
各種フラグ.
bit
位置
bitfield抽出 説明
Mask Shift Macro
b0-2 CV_MAT_DEPTH_MASK 0 CV_MAT_DEPTH(flags) ビット深度 (0 〜 CV_DEPTH_MAX−1)
(CV_{8,16}[SU],CV_32[SF],CV_64F,CV_USRTYPE1)
b3-11 CV_MAT_CN_MASK CV_CN_SHIFT CV_MAT_CN(flags) b3-11はチャネル数−1
CV_MAT_CN(flags) はチャネル数 (1〜CV_CN_MAX(=512)).
b12-13 未使用?
b14 CV_MAT_CONT_FLAG CV_MAT_CONT_FLAG_SHIFT CV_IS_MAT_CONT(flags) 配列データ本体が単一の連続領域であることを示すフラグ.
b15 CV_SUBMAT_FLAG CV_SUBMAT_FLAG_SHIFT CV_IS_SUBMAT(flags) 部分配列であることを示すフラグ.
b16-31 CV_MAGIC_MASK (16) - cv::Mat (cvMat) 型であることを示すマジック番号 (0x4242).
(CV_MAT_MAGIC_VAL=0x42420000)

ソース:$(OpenCV)/sources/modules/core/include/opencv2/core/types_c.h

外部関数・マクロ

int cv::Mat::depth() const
  • 機能:行列要素のビット深度 (下記) を返す.
    depth C/C++の型 size
    (バイト数)
    値の範囲
    (min/max)
    備考
    CV_8U 0 uint8_t
    (unsigned char)
    1 0 〜 UCHAR_MAX(=255) limits.h
    CV_8S 1 int8_t
    (signed char)
    1 UCHAR_MIN(=-128) 〜
    UCHAR_MAX(=127)
    limits.h
    CV_16U 2 uint16_t
    (unsigned short)
    2 0 〜 USHRT_MAX(=655355) limits.h
    CV_16S 3 int16_t
    ((signed) short)
    2 SHRT_MIN(=-32768) 〜
    SHRT_MAX(=32767)
    limits.h
    CV_32S 4 int32_t
    ((signed) int)
    4 INT_MIN(=-2147483648) 〜
    INT_MAX(=2147483647)
    limits.h
    CV_32F 5 float 4 -FLT_MAX(=-3.402823466E+38f) 〜
    FLT_MAX(=3.402823466E+38f), INF, NAN
    float.h
    CV_64F 6 double 8 -DBL_MAX(=-1.7976931348623158E+308) 〜
    DBL_MAX(=1.7976931348623158E+308), INF, NAN
    float.h
    CV_USRTYPE1 7 size_t(?) sizeof(size_t) (size_t)0 〜 ~(size_t)0 内部実装の一部では size_t として扱われているらしい.
  • 参考
    • Mat::depth (本家マニュアル)
    • ソース
      $(OpenCV)/sources/modules/core/include/opencv2/core/mat.hpp
      $(OpenCV)/sources/modules/core/include/opencv2/core/types_c.h (CV_* の定義)
int cv::Mat::type() const
  • 機能:行列要素の種別 (ビット深度+チャネル数) を返す.(例:CV_8UC3,CV_32SC1)
  • 参考
    • Mat::type (本家マニュアル)
    • ソース
      $(OpenCV)/sources/modules/core/include/opencv2/core/mat.hpp
      $(OpenCV)/sources/modules/core/include/opencv2/core/types_c.h (CV_* の定義)
size_t cv::Mat::channels() const
  • 機能:行列のチャネル数を返す.(1 〜 CV_CN_MAX(=512))
  • 参考
    • Mat::channels (本家マニュアル)
    • ソース:$(OpenCV)/sources/modules/core/include/opencv2/core/mat.hpp
size_t cv::Mat::step1(int i = 0) const
  • 機能:行列の第i次元のステップ (要素間隔) を返す.(単位:チャネル数)
    (参考:cv::Mat::step1(i) の代わりに cv::Mat::step[i] を使うと, チャネル数ではなくバイト数が得られる.)
  • 入力
    • i:次元番号 (0 〜 dims−1).2次元の場合,row=0,column=1.
  • 使用例 (2次元の場合)
    const int depth = CV_16U; // ビット深度 (2バイト)
    const int channels = 3; // チャネル数
    const int type = CV_MAKETYPE(depth, channels); // =CV_16UC3
    const int rows = 4; // 行数
    const int cols = 5; // 列数
    
    cv::Mat matrix(rows, cols, type);
    
    // 1チャネルのバイト数:CV_16U → sizeof(uint16_t) = 2バイト
    size_t channelSize = matrix.elemSize1();
    // 1要素のバイト数:channelSize * channels = 6チャネル
    size_t elementSize = matrix.elemSize();
    // 全要素数 = rows * cols = 20
    size_t totalElements = matrix.total();
    
    // 1列当たりの要素間隔 = 1要素分のチャネル数 = channels = 3チャネル
    // (要素 (y, x) と (y, x+1) のメモリ上での距離)
    size_t colStep = matrix.step1(1);
    size_t colStepBytes = matrix.step[1]; // colStep をバイト数で
    
    // 1行当たりの要素間隔 = 1列分のチャネル数 = cols * channels = 15チャネル
    // (要素 (y, x) と (y+1, x) のメモリ上での距離)
    // (注意:matrix が部分行列の場合は,元の行列の cols で計算すること.)
    size_t rowStep = matrix.step1(0);
    size_t rowStepBytes = matrix.step[0]; // rowStep をバイト数で
    
    #ifdef _MSC_VER
    // Visual C/C++ で size_t を出力する場合は %Iu などを使用する.
    printf("channelSize = %Iu bytes\n", channelSize);
    printf("elementSize = %Iu bytes\n", elementSize);
    printf("colStep = %Iu channels = %Iu bytes\n", colStep, colStepBytes);
    printf("rowStep = %Iu channels = %Iu bytes\n", rowStep, rowStepBytes);
    printf("totalElements = %Iu elements\n", totalElements);
    #else // _MSC_VER
    // C99 以降で size_t を出力する場合は %zu などを使用する.(%u でも %d でもないよ!)
    printf("channelSize = %zu bytes\n", channelSize);
    printf("elementSize = %zu bytes\n", elementSize);
    printf("colStep = %zu channels = %zu bytes\n", colStep, colStepBytes);
    printf("rowStep = %zu channels = %zu bytes\n", rowStep, rowStepBytes);
    printf("totalElements = %zu elements\n", totalElements);
    #endif // _MSC_VER
    
    実行結果
    channelSize = 2 bytes
    elementSize = 6 bytes
    colStep = 3 channels = 6 bytes
    rowStep = 15 channels = 30 bytes
    totalElements = 20 elements
    
  • 参考
    • Mat::step1 (本家マニュアル)
    • ソース:$(OpenCV)/sources/modules/core/include/opencv2/core/mat.hpp
inline bool cv::Mat::empty() const
  • 機能:行列が空 (data=NULL または total()=0) か否かを判定する.
  • 戻り値:行列が空 ⇔ true.
  • 参考
    • Mat::empty (本家マニュアル)
    • ソース:$(OpenCV)/sources/modules/core/include/opencv2/core/mat.hpp
size_t cv::Mat::total() const
  • 機能:行列の全要素数を返す.
  • 参考
    • Mat::total (本家マニュアル)
    • ソース:$(OpenCV)/sources/modules/core/include/opencv2/core/mat.hpp
size_t cv::Mat::elemSize() const
  • 機能:行列要素のサイズ (バイト数) を返す.例えば CV_16SC3 の場合,sizeof(int16_t) * 3 = 6.
  • 参考
    • Mat::elemSize (本家マニュアル)
    • ソース:$(OpenCV)/sources/modules/core/include/opencv2/core/mat.hpp
size_t cv::Mat::elemSize1() const
  • 機能:行列の1要素の1チャネル分のサイズ (バイト数) を返す.例えば CV_16SC3 の場合,(チャネル数に関係なく) sizeof(int16_t)= 2 を返す.
  • 参考
    • Mat::elemSize1 (本家マニュアル)
    • ソース:$(OpenCV)/sources/modules/core/include/opencv2/core/mat.hpp
void cv::Mat::create(int rows, int cols, int type)
void cv::Mat::create(cv::Size size, int type)
void cv::Mat::create(int ndims, const int sizes[/* ndims */], int type)
  • 機能:必要ならば,新しい配列データ用のメモリを割り当てる.
  • 入力
    • ndims:配列の新しい次元数 (0 〜 CV_MAX_DIM).
    • rows:新しい行数.
    • cols:新しい列数.
    • size:新しい列数および行数 (=cv::Size(cols, rows)).
    • sizes (≠NULL):各次元の要素数の配列.
    • type:新しい要素種別.
  • 処理
    1. 配列の形状および要素種別を変更する必要がなければ何もせずに終了.そうでなければ次へ.
    2. 配列データ本体を Mat::release() で解放する.
    3. ヘッダを更新する.
    4. 新しいデータ領域 (total() * elemSize() バイト) を割り当て,参照カウントを1に設定する.
  • ソースファイル
    $(OpenCV)/include/opencv2/core/core.hpp
    $(OpenCV)/include/opencv2/core/mat.hpp
    $(OpenCV)/sources/modules/core/src/matrix.cpp
  • 参考
inline void cv::Mat::release()
  • 機能:行列のデータ本体を解放する.(データ本体の参照カウントを -1 し,0 になればそのメモリを解放する.)
  • 注意
    • 2.4.9 以前:Mat::size[0] (1〜2次元の場合は rows) だけを 0 にする.
    • 2.4.10 以後:Mat::size[0 〜 dims-1] (1次元の場合は rows,2次元の場合は rows と cols) を全部 0 にする.
  • 参考
    • Mat::release (本家マニュアル)
    • ソース:$(OpenCV)/sources/modules/core/include/opencv2/core/mat.hpp
size_t cv::Mat::clone() const
  • 機能:行列のヘッダとデータ本体をコピーする (deep copy).
  • 注意:(コピー元が部分行列であったとしても) コピー先は全体行列 (要素はメモリ上で連続) となる.
  • 参考
    • Mat::clone (本家マニュアル)
    • ソース:$(OpenCV)/sources/modules/core/include/opencv2/core/mat.hpp
    • ソース:$(OpenCV)/sources/modules/core/src/copy.cpp (cv::Mat::copyTo())
int cv::Mat::checkVector(int elemChannels, int depth = -1, bool requireContinuous = true) const
  • 機能:行列が次の条件を満たすかチェックする.
    • 2次元の場合
      • 1×N,チャネル数:elemChannels
      • N×1,チャネル数:elemChannels
      • N×elemChannels,チャネル数:1
    • 3次元の場合
      • 1×N×elemChannels,チャネル数:1
      • N×1×elemChannels,チャネル数:1
    • ビット深度が depth である.(depth≧1 の場合)
    • メモリ領域が連続している.(requireContinuous=true の場合)
  • 入力
    • elemChannels:要素のチャネル数.
    • depth:ビット深度.指定しない場合は0以下.
    • requireContinuous:メモリ領域が連続していることを要求する.
  • 戻り値:上記の条件を満たす場合は N,そうでなければ -1.
  • ソースファイル
    $(OpenCV)/sources/modules/core/include/opencv2/core/core.hpp
    $(OpenCV)/sources/modules/core/src/matrix.cpp

内部関数・マクロ

CV_ELEM_SIZE1(type)
  • 機能:行列要素1チャネル分のサイズ (バイト数) を取得する.
  • 入力
    • type:行列要素の型 (CV_8UC1 など) またはビット深度 (CV_8U など).
  • 戻り値:行列要素1チャネル分のサイズ (バイト数).ただしビット深度が CV_USRTYPE1 の場合は sizeof(size_t).つまり,
    • CV_ELEM_SIZE1(CV_8[US]) → 1.
    • CV_ELEM_SIZE1(CV_16[US]) → 2.
    • CV_ELEM_SIZE1(CV_32[SF]) → 4.
    • CV_ELEM_SIZE1(CV_64F) → 8.
    • CV_ELEM_SIZE1(CV_USRTYPE1) → sizeof(size_t).
  • 定義
    $(OpenCV)/sources/modules/core/include/opencv2/core/types_c.h
    /* Size of each channel item,
       0x124489 = 1000 0100 0100 0010 0010 0001 0001 ~ array of sizeof(arr_type_elem) */
    #define CV_ELEM_SIZE1(type) \
        ((((sizeof(size_t)<<28)|0x8442211) >> CV_MAT_DEPTH(type)*4) & 15)
    
CV_ELEM_SIZE(type)
  • 機能:行列要素のサイズ (バイト数) を取得する.
  • 入力
    • type:行列要素の型 (CV_8UC1 など).
  • 戻り値:行列要素のサイズ (バイト数). つまり CV_ELEM_SIZE1(type) * CV_MAT_CN(type) と同じ.
  • 定義
    $(OpenCV)/sources/modules/core/include/opencv2/core/types_c.h
    /* 0x3a50 = 11 10 10 01 01 00 00 ~ array of log2(sizeof(arr_type_elem)) */
    #define CV_ELEM_SIZE(type) \
        (CV_MAT_CN(type) << ((((sizeof(size_t)/4+1)*16384|0x3a50) >> CV_MAT_DEPTH(type)*2) & 3))
    
  • 注意:ビット深度が CV_USRTYPE1 の場合,sizeof(size_t) が4または8以外の処理系では期待どおりの値を返さない可能性がある. (上記の定義の (sizeof(size_t)/4+1) は,sizeof(size_t) が4または8の場合に log2(sizeof(size_t)) に一致するよう強引に当てはめた式だから.)
static inline void setSize(cv::Mat &m, int _dims, const int _sz[/* _dims */], const size_t _steps[/* _dims - 1 */], bool autoSteps = false)
  • 機能:配列の次元数 (および各次元の要素数・要素間隔) を設定・変更する. (配列データ本体は変更しない.)
    • 次元数,各次元の要素数,各次元の要素間隔を全部指定する場合 (_sz≠NULL,_steps≠NULL)
      • _sz[0 〜 _dims-1]:各次元の要素数の配列.
      • _steps[0 〜 _dims-2]:配列の各次元の要素間隔 (バイト数) の配列.
        最後の次元の要素間隔 (_steps[_dims-1] に相当) は要素サイズ (CV_ELEM_SIZE(m.flags)) に固定されている.
    • 次元数と要素数を設定し,要素間隔を指定しない場合 (_sz≠NULL,_steps=NULL)
      • autoSteps=true ならば,要素間隔を自動設定する.要素の型を ElementType,_sz[i] を Ni と書くと,配列データ本体のメモリ配置は次の C/C++ 配列と同じになる.
        ElementType data[N0][N1]…[N<dims-1>];
        
        なお,配列データ本体の全サイズ (バイト数) が size_t の範囲を超えると例外 CV_StsOutOfRange が発生する.
      • autoSteps=false ならば,要素間隔を設定しない.
        (次元数を変更しない場合には前回の設定値がそのまま残る?)
    • 次元数のみを設定し,要素数・要素間隔を指定しない場合 (_sz=NULL,_steps は無視される.)
  • 入力
    • _dims (0 〜 CV_MAX_DIM):配列の次元.
    • _sz[0 〜 _dims-1]:配列の各次元のサイズ (要素数) の配列._sz=NULL の場合は次元の数だけを設定・変更する.
    • _steps[0 〜 _dims-2]:配列の各次元の要素間隔 (バイト数) の配列. _sz=NULL の場合は無視される.最後の次元の要素間隔 (_steps[_dims-1] に相当) は要素サイズ (CV_ELEM_SIZE(m.flags)) に固定されている.
    • autoSteps:_sz≠NULL,_steps=NULL の場合に要素間隔を自動計算する.
  • 入出力:m

VC2012 で OpenCV 2.4.9 のサンプルをビルドする方法

OpenCV には (WinRT 用サンプルを除いて) VisualStudio のソリューションファイル (*.sln,*.vcxproj) は含まれておらず,CMake を使って CMakeLists.txt から自動生成するようになっているらしい. しかしそのためにはいくつもツールをダウンロードしてインストールしなければならないので面倒.

サンプルを動かすためにそこまでしたくないので, 自分でプロジェクトファイルを作成する方法を次に示す.

画像ファイル表示サンプル (display_image)

  1. コンソールアプリケーションの空プロジェクトを作成する.
  2. 下記のサンプルソースをプロジェクトのディレクトリにコピーし,プロジェクトに追加する.
    $(OpenCV)\sources\samples\cpp\tutorial_code\introduction\windows_visual_studio_Opencv\introduction_windows_vs.cpp

  3. 追加のインクルードディレクトリ:$(OpenCV)\build\include
  4. 使用するライブラリ (DLL or static) に応じて,下記の表に従ってプロジェクトを設定する.

使用する
OpenCV
ライブラリ
VC プロジェクトのプロパティ 必要 DLL
(Windows 標準以外)
C/C++ /
コード生成 /
Runtime Lib.
リンカー / 全般 /
追加の依存ファイル
リンカー / 入力 /
追加のライブラリディレクトリ
(VC2012,x86 の場合)
Static Debug Multithread
Debug (/MTd)
opencv_core249d.lib
opencv_highgui249d.lib
IlmImfd.lib
libtiffd.lib
libpngd.lib
libjpegd.lib
libjasperd.lib
zlibd.lib
ComCtl32.lib
$(OpenCV)\
build\x86\vc11\staticlib
-
Release Multithread
(/MT)
opencv_core249.lib
opencv_highgui249.lib
IlmImf.lib
libtiff.lib
libpng.lib
libjpeg.lib
libjasper.lib
zlib.lib
ComCtl32.lib
-
DLL Debug Multithread
Debug DLL
(/MDd)
opencv_core249d.lib
opencv_highgui249d.lib
$(OpenCV)\
build\x86\vc11\lib
opencv_core249d.dll
opencv_highgui249d.dll
Release Multithread
DLL (/MD)
opencv_core249.lib
opencv_highgui249.lib
opencv_core249.dll
opencv_highgui249.dll

サイト内関連ページ


外部へのリンク (敬称略)


更新履歴

  1. 2014/07/06(日) 作成開始
  2. 2014/08/01(金) とりあえず公開
  3. 2014/08/10(日)「モルフォロジー」を追加.
  4. 2014/08/19(火) cv::warpAffine を追加.
  5. 2014/08/22(金) cv::getRotationMatrix2D を追加.
  6. 2014/09/26(金) cv::fitLine を追加.
  7. 2014/10/13(月) cv::Mat::checkVector を追加.
  8. 2014/11/12(水) cv::findContourscv::minAreaRect を追加.
  9. 2014/12/03(水) cv::flip を追加.
  10. 2015/01/04(日) cv::resize を追加.
  11. 2015/02/16(月) cv::convexHull を追加.
  12. 2015/04/15(水) cv::reduce を追加.
  13. 2015/05/10(日) cv::borderInterpolate を追加.
  14. 2015/09/03(木) cv::Mat::create を追加.
  15. 2015/10/01(木) cv::Canny を追加.
  16. 2015/10/04(日) cv::Matdepth, type, channels, step1, total, elemSize, elemSize1, clone を追加.
  17. 2015/10/19(月) 画像フィルタ (cv::blurcv::Sobelcv::Scharr) を追加.
  18. 2015/11/04(水) cv::bilateralFilter を追加.
  19. 2015/11/15(日) cv::morphologyDefaultBorderValue を追加.
  20. 2016/01/27(水) cv::Mat::empty を追加.
  21. 2016/08/05(金) cv::cvtColor色変換コード一覧表を追加.
  22. 2016/10/08(土) cv::Mat::release を追加.
  23. 2016/10/19(水) cv::matchTemplate を追加.
  24. 2016/10/22(土)「バージョン番号の取得」を追加.


Copyright © 2014-2016 noocyte.
E-mail: relipmoced (a) yahoo.co.jp
  (" (a) " を半角のアットマークに書き替えてください.)
リンクはご自由に.
「noocyte のプログラミング研究室」トップページに戻る.