OpenCV の使い方や内部実装を調べながら作成中のメモ. おもに 3.x だが,一部 2.x の説明も残っている.
RGB(A) 系およびグレイスケール間の相互変換
From\To | BGR | BGRA | BGR565 | BGR555 | RGB | RGBA | GRAY |
---|---|---|---|---|---|---|---|
BGR | \ | COLOR_BGR2BGRA | COLOR_BGR2BGR565 | COLOR_BGR2BGR555 | COLOR_BGR2RGB | COLOR_BGR2RGBA | COLOR_BGR2GRAY |
BGRA | COLOR_BGRA2BGR | \ | COLOR_BGRA2BGR565 | COLOR_BGRA2BGR555 | COLOR_BGRA2RGB | COLOR_BGRA2RGBA | COLOR_BGRA2GRAY |
BGR565 | COLOR_BGR5652BGR | COLOR_BGR5652BGRA | \ | - | COLOR_BGR5652RGB | COLOR_BGR5652RGBA | COLOR_BGR5652GRAY |
BGR555 | COLOR_BGR5552BGR | COLOR_BGR5552BGRA | - | \ | COLOR_BGR5552RGB | COLOR_BGR5552RGBA | COLOR_BGR5552GRAY |
RGB | COLOR_RGB2BGR | COLOR_RGB2BGRA | COLOR_RGB2BGR565 | COLOR_RGB2BGR555 | \ | COLOR_RGB2RGBA | COLOR_RGB2GRAY |
RGBA | COLOR_RGBA2BGR | COLOR_RGBA2BGRA | COLOR_RGBA2BGR565 | COLOR_RGBA2BGR555 | COLOR_RGBA2RGB | \ | COLOR_RGBA2GRAY |
GRAY | COLOR_GRAY2BGR | COLOR_GRAY2BGRA | COLOR_GRAY2BGR565 | COLOR_GRAY2BGR555 | COLOR_GRAY2RGB | COLOR_GRAY2RGBA | \ |
RGBA ⇔ mRGBA (Premultiplied RGBA,事前乗算済アルファ) 双方向変換
\ | mRGBA |
---|---|
RGBA | COLOR_RGBA2mRGBA COLOR_mRGBA2RGBA |
(BGR,RGB) ⇔ (HLS, HSV, Lab, Luv, XYZ, YCrCb, YUV) 双方向変換
\ | HLS | HSV | Lab | Luv | XYZ | YCrCb | YUV |
---|---|---|---|---|---|---|---|
BGR | COLOR_BGR2HLS COLOR_HLS2BGR |
COLOR_BGR2HSV COLOR_HSV2BGR |
COLOR_BGR2Lab COLOR_Lab2BGR |
COLOR_BGR2Luv COLOR_Luv2BGR |
COLOR_BGR2XYZ COLOR_XYZ2BGR |
COLOR_BGR2YCrCb COLOR_YCrCb2BGR |
COLOR_BGR2YUV COLOR_YUV2BGR |
RGB | COLOR_RGB2HLS COLOR_HLS2RGB |
COLOR_RGB2HSV COLOR_HSV2RGB |
COLOR_RGB2Lab COLOR_Lab2RGB |
COLOR_RGB2Luv COLOR_Luv2RGB |
COLOR_RGB2XYZ COLOR_XYZ2RGB |
COLOR_RGB2YCrCb COLOR_YCrCb2RGB |
COLOR_RGB2YUV COLOR_YUV2RGB |
(LBGR,LRGB) ⇔ (Lab, Luv) 双方向変換
LRGB:輝度(Luminance)+RGB. アマチュア天文家が高画質モノクロ画像と低画質カラー画像から高画質カラー画像を作成するのに使用するらしい.
\ | Lab | Luv |
---|---|---|
LBGR | COLOR_LBGR2Lab COLOR_Lab2LBGR |
COLOR_LBGR2Luv COLOR_Luv2LBGR |
LRGB | COLOR_LRGB2Lab COLOR_Lab2LRGB |
COLOR_LRGB2Luv COLOR_Luv2LRGB |
入力専用フォーマット (YUV420(s)p)
From\To | BGR | RGB | BGRA | RGBA | GRAY |
---|---|---|---|---|---|
YUV420p | COLOR_YUV420p2BGR | COLOR_YUV420p2RGB | COLOR_YUV420p2BGRA | COLOR_YUV420p2RGBA | COLOR_YUV420p2GRAY |
YUV420sp | COLOR_YUV420sp2BGR | COLOR_YUV420sp2RGB | COLOR_YUV420sp2BGRA | COLOR_YUV420sp2RGBA | COLOR_YUV420sp2GRAY |
入力専用フォーマット (Bayer)
From\To | BGR | RGB | BGRA | RGBA | BGR_EA | RGB_EA | BGR_VNG | RGB_VNG | GRAY |
---|---|---|---|---|---|---|---|---|---|
BayerBG | COLOR_BayerBG2BGR | COLOR_BayerBG2RGB | COLOR_BayerBG2BGRA | COLOR_BayerBG2RGBA | COLOR_BayerBG2BGR_EA | COLOR_BayerBG2RGB_EA | COLOR_BayerBG2BGR_VNG | COLOR_BayerBG2RGB_VNG | COLOR_BayerBG2GRAY |
BayerGB | COLOR_BayerGB2BGR | COLOR_BayerGB2RGB | COLOR_BayerGB2BGRA | COLOR_BayerGB2RGBA | COLOR_BayerGB2BGR_EA | COLOR_BayerGB2RGB_EA | COLOR_BayerGB2BGR_VNG | COLOR_BayerGB2RGB_VNG | COLOR_BayerGB2GRAY |
BayerGR | COLOR_BayerGR2BGR | COLOR_BayerGR2RGB | COLOR_BayerGR2BGRA | COLOR_BayerGR2RGBA | COLOR_BayerGR2BGR_EA | COLOR_BayerGR2RGB_EA | COLOR_BayerGR2BGR_VNG | COLOR_BayerGR2RGB_VNG | COLOR_BayerGR2GRAY |
BayerRG | COLOR_BayerRG2BGR | COLOR_BayerRG2RGB | COLOR_BayerRG2BGRA | COLOR_BayerRG2RGBA | COLOR_BayerRG2BGR_EA | COLOR_BayerRG2RGB_EA | COLOR_BayerRG2BGR_VNG | COLOR_BayerRG2RGB_VNG | COLOR_BayerRG2GRAY |
出力専用フォーマット (HLS_FULL,HSV_FULL)
From\To | HLS_FULL | HSV_FULL |
---|---|---|
BGR | COLOR_BGR2HLS_FULL | COLOR_BGR2HSV_FULL |
RGB | COLOR_RGB2HLS_FULL | COLOR_RGB2HSV_FULL |
出力専用フォーマット (BGR_FULL,RGB_FULL)
From\To | BGR_FULL | RGB_FULL |
---|---|---|
HLS | COLOR_HLS2BGR_FULL | COLOR_HLS2RGB_FULL |
HSV | COLOR_HSV2BGR_FULL | COLOR_HSV2RGB_FULL |
出力専用フォーマット (YUV_I420,YUV_IYUV,YUV_UV12)
From\To | YUV_I420 | YUV_IYUV | YUV_YV12 |
---|---|---|---|
BGR | COLOR_BGR2YUV_I420 | COLOR_BGR2YUV_IYUV | COLOR_BGR2YUV_YV12 |
RGB | COLOR_RGB2YUV_I420 | COLOR_RGB2YUV_IYUV | COLOR_RGB2YUV_YV12 |
BGRA | COLOR_BGRA2YUV_I420 | COLOR_BGRA2YUV_IYUV | COLOR_BGRA2YUV_YV12 |
RGBA | COLOR_RGBA2YUV_I420 | COLOR_RGBA2YUV_IYUV | COLOR_RGBA2YUV_YV12 |
YUV からの出力専用フォーマット (YUV ⇒ p_q)
q\p | BGR | BGRA | RGB | RGBA | GRAY |
---|---|---|---|---|---|
IYUV | COLOR_YUV2BGR_IYUV (YUV ⇒ BGR_IYUV) |
COLOR_YUV2BGRA_IYUV (YUV ⇒ BGRA_IYUV) |
COLOR_YUV2RGB_IYUV (YUV ⇒ RGB_IYUV) |
COLOR_YUV2RGBA_IYUV (YUV ⇒ RGBA_IYUV) |
COLOR_YUV2GRAY_IYUV (YUV ⇒ GRAY_IYUV) |
NV12 | COLOR_YUV2BGR_NV12 (YUV ⇒ BGR_NV12) |
COLOR_YUV2BGRA_NV12 (YUV ⇒ BGRA_NV12) |
COLOR_YUV2RGB_NV12 (YUV ⇒ RGB_NV12) |
COLOR_YUV2RGBA_NV12 (YUV ⇒ RGBA_NV12) |
COLOR_YUV2GRAY_NV12 (YUV ⇒ GRAY_NV12) |
NV21 | COLOR_YUV2BGR_NV21 (YUV ⇒ BGR_NV21) |
COLOR_YUV2BGRA_NV21 (YUV ⇒ BGRA_NV21) |
COLOR_YUV2RGB_NV21 (YUV ⇒ RGB_NV21) |
COLOR_YUV2RGBA_NV21 (YUV ⇒ RGBA_NV21) |
COLOR_YUV2GRAY_NV21 (YUV ⇒ GRAY_NV21) |
UYNV | COLOR_YUV2BGR_UYNV (YUV ⇒ BGR_UYNV) |
COLOR_YUV2BGRA_UYNV (YUV ⇒ BGRA_UYNV) |
COLOR_YUV2RGB_UYNV (YUV ⇒ RGB_UYNV) |
COLOR_YUV2RGBA_UYNV (YUV ⇒ RGBA_UYNV) |
COLOR_YUV2GRAY_UYNV (YUV ⇒ GRAY_UYNV) |
UYVY | COLOR_YUV2BGR_UYVY (YUV ⇒ BGR_UYVY) |
COLOR_YUV2BGRA_UYVY (YUV ⇒ BGRA_UYVY) |
COLOR_YUV2RGB_UYVY (YUV ⇒ RGB_UYVY) |
COLOR_YUV2RGBA_UYVY (YUV ⇒ RGBA_UYVY) |
COLOR_YUV2GRAY_UYVY (YUV ⇒ GRAY_UYVY) |
Y422 | COLOR_YUV2BGR_Y422 (YUV ⇒ BGR_Y422) |
COLOR_YUV2BGRA_Y422 (YUV ⇒ BGRA_Y422) |
COLOR_YUV2RGB_Y422 (YUV ⇒ RGB_Y422) |
COLOR_YUV2RGBA_Y422 (YUV ⇒ RGBA_Y422) |
COLOR_YUV2GRAY_Y422 (YUV ⇒ GRAY_Y422) |
YUNV | COLOR_YUV2BGR_YUNV (YUV ⇒ BGR_YUNV) |
COLOR_YUV2BGRA_YUNV (YUV ⇒ BGRA_YUNV) |
COLOR_YUV2RGB_YUNV (YUV ⇒ RGB_YUNV) |
COLOR_YUV2RGBA_YUNV (YUV ⇒ RGBA_YUNV) |
COLOR_YUV2GRAY_YUNV (YUV ⇒ GRAY_YUNV) |
YUY2 | COLOR_YUV2BGR_YUY2 (YUV ⇒ BGR_YUY2) |
COLOR_YUV2BGRA_YUY2 (YUV ⇒ BGRA_YUY2) |
COLOR_YUV2RGB_YUY2 (YUV ⇒ RGB_YUY2) |
COLOR_YUV2RGBA_YUY2 (YUV ⇒ RGBA_YUY2) |
COLOR_YUV2GRAY_YUY2 (YUV ⇒ GRAY_YUY2) |
YUYV | COLOR_YUV2BGR_YUYV (YUV ⇒ BGR_YUYV) |
COLOR_YUV2BGRA_YUYV (YUV ⇒ BGRA_YUYV) |
COLOR_YUV2RGB_YUYV (YUV ⇒ RGB_YUYV) |
COLOR_YUV2RGBA_YUYV (YUV ⇒ RGBA_YUYV) |
COLOR_YUV2GRAY_YUYV (YUV ⇒ GRAY_YUYV) |
YV12 | COLOR_YUV2BGR_YV12 (YUV ⇒ BGR_YV12) |
COLOR_YUV2BGRA_YV12 (YUV ⇒ BGRA_YV12) |
COLOR_YUV2RGB_YV12 (YUV ⇒ RGB_YV12) |
COLOR_YUV2RGBA_YV12 (YUV ⇒ RGBA_YV12) |
COLOR_YUV2GRAY_YV12 (YUV ⇒ GRAY_YV12) |
YVYU | COLOR_YUV2BGR_YVYU (YUV ⇒ BGR_YVYU) |
COLOR_YUV2BGRA_YVYU (YUV ⇒ BGRA_YVYU) |
COLOR_YUV2RGB_YVYU (YUV ⇒ RGB_YVYU) |
COLOR_YUV2RGBA_YVYU (YUV ⇒ RGBA_YVYU) |
COLOR_YUV2GRAY_YVYU (YUV ⇒ GRAY_YVYU) |
I420 | COLOR_YUV2BGR_I420 (YUV ⇒ BGR_I420) |
COLOR_YUV2BGRA_I420 (YUV ⇒ BGRA_I420) |
COLOR_YUV2RGB_I420 (YUV ⇒ RGB_I420) |
COLOR_YUV2RGBA_I420 (YUV ⇒ RGBA_I420) |
COLOR_YUV2GRAY_I420 (YUV ⇒ GRAY_I420) |
420 | - | - | - | - | COLOR_YUV2GRAY_420 (YUV ⇒ GRAY_420) |
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 画像のみ使用可能.) |
adaptiveMethod | T(x, y) |
---|---|
ADAPTIVE_THRESH_MEAN_C | (ブロックの平均 (矩形窓)) − C |
ADAPTIVE_THRESH_GAUSSIAN_C | (ブロックの加重平均 (ガウス窓)) − C |
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 | 二値化 (反転) |
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 |
-1 | 0 | +1 |
-2 | 0 | +2 |
-1 | 0 | +1 |
-3 | 0 | +3 |
-10 | 0 | +10 |
-3 | 0 | +3 |
cv::Scharr(src, dst, ddepth, dx, dy, scale, delta, borderType);は,
cv::Sobel(src, dst, ddepth, dx, dy, CV_SCHARR, scale, delta, borderType);と同じ.(cv::Sobel 参照)
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:恒等変換) |
cv::resize(src, dst, dst.size(), 0, 0, interpolation);
cv::resize(src, dst, cv::Size(), 0.5, 0.5, interpolation);
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 の逆変換を使用する. |
void CvCalcHistTest(cv::Mat &grayscaleImage) { // 8bit grayscale 画像専用 CV_Assert(grayscaleImage.type() == CV_8UC1); const int nImages = 1; // 入力画像の数 const int histDims = 1; // ヒストグラムの次元 // ヒストグラムの軸を grayscaleImage の channel 0 に対応させる. const int channels[histDims] = { 0 }; cv::Mat mask; // マスクなし (空の画像) // ヒストグラム各軸のサイズ (ビン数) const int histSize[histDims] = { 256 }; // ヒストグラム第0軸の値の範囲 (grayscaleImage の画素値の範囲) const float histRange0[2] = { 0, 256 }; // [low, high) なので { 0, 255 } ではない. // ヒストグラム各軸の値の範囲へのポインタ配列 const float *histRanges[histDims] = { histRange0 }; // ヒストグラム cv::Mat histogram; // ヒストグラムを求める. cv::calcHist(&grayscaleImage, nImages, channels, mask, histogram, histDims, histSize, histRanges); // histDims=1 なので histogram のサイズは rows=histSize[0]=256,cols=1 になる. printf("histogram[rows:%d cols:%d depth:0x%X]\n", histogram.rows, histogram.cols, histogram.depth()); // マニュアルには記載されていないが,histogram の深度は CV_32F になるらしい. CV_Assert(histogram.depth() == CV_32F); // ヒストグラムの内容を出力する. double totalFrequency = 0; // 合計度数 for(int row = 0; row < histogram.rows; row++) { float frequency = histogram.at<float>(row, 0); printf("histogram[%d]: %G\n", row, frequency); totalFrequency += frequency; } printf("TotalFrequency: %G\n", totalFrequency); // 合計度数は画像の全画素数に一致するはず. CV_Assert(totalFrequency == (double)grayscaleImage.total()); }
値 | 説明 |
---|---|
CCL_WU (=0) | SAUF アルゴリズム. |
CCL_GRANA (=1) | 8連結の場合:BBDT,4連結の場合:SAUF. |
CCL_DEFAULT (=-1) | CCL_GRANA と同じ. |
値 | 説明 |
---|---|
cv::CC_STAT_LEFT (=0) | ラベル領域の外接矩形の左端X座標 |
cv::CC_STAT_TOP (=1) | ラベル領域の外接矩形の上端Y座標 |
cv::CC_STAT_WIDTH (=2) | ラベル領域の外接矩形の幅 |
cv::CC_STAT_HEIGHT (=3) | ラベル領域の外接矩形の高さ |
cv::CC_STAT_AREA (=4) | ラベル領域の面積 (画素数) |
cv::CC_STAT_MAX (=5) | (cv::CC_STAT_* の最大値) |
←───── 補外前の1次元画像 ─────→ ┌─┬ … ─┳━━┳━━┳ … ┳━━┳ … ┳━━━━━━┳ … ┬──────┬ … │ │ ┃p[0]┃p[1]┃ ┃p[i]┃ ┃p[length-1] ┃ │p[position] │ └─┴ … ─┻━━┻━━┻ … ┻━━┻ … ┻━━━━━━┻ … ┴──────┴ … │ ↑ └─────────────────┘ 補外 (コピー)
borderType | 値 | 外挿パターン | 説明 |
---|---|---|---|
BORDER_REPLICATE | 1 | aaaaaaaa | abcdefgh | hhhhhhhh | 境界画素を延長 (反復使用) する. |
BORDER_REFLECT | 2 | hgfedcba | abcdefgh | hgfedcba | 境界画素の端で鏡映. ((−length ≦ position < 0) || (length ≦ position < 2 * length − 1)) |
BORDER_REFLECT_101 BORDER_REFLECT101 BORDER_DEFAULT |
4 | hgfedcb | abcdefgh | gfedcba | 境界画素の中心で鏡映. ((1 − length ≦ position < 0) || (length ≦ position < 2 * length − 2)) |
BORDER_WRAP | 3 | abcdefgh | abcdefgh | abcdefgh | 画像全体を繰り返す.(N次元トーラス) |
BORDER_CONSTANT | 0 | vvvvvvvv | abcdefgh | vvvvvvvv | 指定された画素値 v=borderValue で延長する. borderInterpolate( ) は常に -1 を返す. |
rtype | 値 | 説明 | 備考 |
---|---|---|---|
CV_REDUCE_SUM | 0 | 合計 | dst には src より大きなビット深度が必要. |
CV_REDUCE_AVG | 1 | 平均 | |
CV_REDUCE_MAX | 2 | 最大値 | dst のビット深度は src と同等以上. |
CV_REDUCE_MIN | 3 | 最小値 |
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°回転) |
mode | 値 | 説明 |
---|---|---|
cv::RETR_EXTERNAL | 0 | 最も外側の (extreme outer) 輪郭. (閉じていない輪郭線は無視される?) |
cv::RETR_LIST | 1 | 階層関係を無視してすべての輪郭線を抽出する. |
cv::RETR_CCOMP | 2 | すべての輪郭線を2レベルの階層に組織化する.
|
cv::RETR_TREE | 3 | すべての輪郭線を木構造に組織化する. 親子関係は入れ子になっている輪郭線を表す. 親は閉じた輪郭線,子はその内側にある輪郭線. |
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 |
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) |
これは単にキー入力を待つだけの関数ではなく,実際には GUI のイベントループ (Windows ではメッセージループ) であり,HighGUI で唯一のイベント処理関数である.(例えばヒストグラムのサンプル demhist.cpp を参照.)
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
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 として扱われているらしい. |
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
$(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)
$(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))
ElementType data[N0][N1]…[N<dims-1>];なお,配列データ本体の全サイズ (バイト数) が size_t の範囲を超えると例外 CV_StsOutOfRange が発生する.
バージョン番号は 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 になる.
OpenCV には (WinRT 用サンプルを除いて) VisualStudio のソリューションファイル (*.sln,*.vcxproj) は含まれておらず,CMake を使って CMakeLists.txt から自動生成するようになっているらしい. しかしそのためにはいくつもツールをダウンロードしてインストールしなければならないので面倒.
サンプルを動かすためにそこまでしたくないので, 自分でプロジェクトファイルを作成する方法を次に示す.
使用する 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 |
Copyright © 2014-2020 noocyte. E-mail: relipmoced (a) yahoo.co.jp (" (a) " を半角のアットマークに書き替えてください.) リンクはご自由に. 「noocyte のプログラミング研究室」トップページに戻る. |
|