OpenCv_Mat のプロパティ

コピペ。

ex ) cv::Mat m1(3, 4, CV_64FC1);

プロパティ 説明 出力
m1.rows 行数 3
m1.cols 列数 4
m1.dims 次元数 2
m1.size( ).width , m1.size( ).height サイズ 4, 3
m1.depth( ) ビット深度ID 6
m1.channels( ) チャンネル数 1
m1.elemSize( ) 複数チャンネルから成る
1 要素のサイズ [ バイト単位 ]
8
m1.elemSize1( ) 1 要素内の1チャンネル分のサイズ
[ バイト単位 ] ( elemSize / channels )
8
m1.total( ) 要素の総数 12
m1.step ステップ数 [ バイト単位 ] 32
m1.step1( ) 1 ステップ内のチャンネル総数 4
m1.isContinuous( ) データは連続か true
m1.isSubmatrix( ) 部分行列か false
m1.empty( ) データは空か false

http://opencv.jp/opencv-2.1/cpp/basic_structures.html?#cv-mat-mat に。

 

byte と bit がゴッチャなのでメモ。

    cv::Mat m1(3,4,CV_8U);
    m1.depth( ) // 0 → ビット深度 ID
    m1.elemSize( ) // 1複数チャンネルから成る 1 要素のサイズ ( バイト単位 )
    m1.step // 4 → ステップ数  4 * 1( バイト単位 )
   
    cv::Mat m1(3,4,CV_8UC3);
    m1.depth( ) // 0
    m1.elemSize( ) // 3
    m1.step // 12

m1.type( ) と混同してしまった。

 

 

isContinuous

行列の要素が連続して格納されていれば ( 各行の最後にギャップが存在しなければ )
true 、そうでなければ false を返す。
要素が途切れることなく格納されている行列、
つまり、行間にギャップが存在しない行列を連続している行列と呼ぶ。

1x1 や 1xN の行列は常に連続。
Mat::create( ) によって作成された行列は常に連続だが、
Mat::col( )、Mat::diag( ) などによって部分行列が抜き出された場合、
外部データに対して行列ヘッダが作成された場合などは、
行列は連続とは限らない

ex ) 使用方法 

    // 配列の連続性チェックを行い、連続だった場合
    // 配列を 1 次元ベクトルとして扱う。
    Size size = src1.size();
    if( src1.isContinuous() && src2.isContinuous() && dst.isContinuous() )
    {
        size.width *= size.height;
        size.height = 1;
    }
    size.width *= 4;

 

IplImage からのキャストを行った場合や、ROI を利用した場合など
データが不連続になる場合がある。
ポインタを利用してデータにアクセスする場合、データの連続・不連続
問題を意識することが重要。
http://opencv.jp/cookbook/opencv_mat.html#id4 より拝借。
f:id:koshinRan:20181203184812p:plain

 

 

data

ユーザデータへのポインタ。
1 次元配列のようにアクセスすることが出来る。
ex ) mat.data [ y * image.cols + x ] ;  // グレースケール画像( 8bit )

 

 

 

こちらから。
http://opencv.jp/cookbook/opencv_mat.html#id20
http://opencv.jp/opencv-2svn/cpp/basic_structures.html#cv-mat-iscontinuous
http://kassymemo.blogspot.com/2011/09/opencv2cvmat.html
http://opencv.jp/opencv-2svn/cpp/gpu_data_structures.html#cv-gpu-createcontinuous

以上。