Pynote

Python、機械学習、画像処理について

OpenCV - cv::Mat の各種プロパティ

試した環境

プロパティの一覧

// 形状が 2x3 で要素の型が CV_32FC3 である行列を作成する。
cv::Mat mat(2, 3, CV_32FC3);

f:id:nekobean:20180416143229p:plain

行列の形状 (行数、列数、次元数)
  • rows: 行列の行数を表す。
  • cols: 行列の列数を表す。
  • dims: 配列の次元数を表す。(行列の場合、2)
  • size(): 行列の行数及び列数を取得する。

std::cout << "rows: " << mat.rows << std::endl;
std::cout << "cols: " << mat.cols << std::endl;
std::cout << "size(cols, rows): " << mat.size() << std::endl;
std::cout << "dims: " << mat.dims << std::endl;

出力

rows: 2
cols: 3
size(cols, rows): [3 x 2]
dims: 2
行列の要素数
  • channels(): チャンネル数を取得する。
  • total(): 合計の要素数を取得する。
  • step1(): 1行あたりの要素数を取得する。

// チャンネル数
std::cout << "channels: " << mat.channels() << std::endl;
// 合計の要素数
std::cout << "total: " << mat.total() << std::endl;
// 1行あたりの要素数
std::cout << "step1: " << mat.step1() << std::endl;

出力

channels: 3
total: 6
step1: 9

f:id:nekobean:20180416143321p:plain

行列のバイト数
  • elemSize(): 1チャンネルあたりのバイト数を取得する。
  • elemSize1(): 1要素あたりのバイト数を取得する。
  • step: 1行あたりのバイト数を表す。

f:id:nekobean:20180416143349p:plain

// 4(float) x 3(channles) = 12 byte
std::cout << "elemSize: " << mat.elemSize() << std::endl;
// 4(float) byte
std::cout << "elemSize1: " << mat.elemSize1() << std::endl;
// 4(float) x 3(channles) x 3(cols) = 36 byte
std::cout << "step: " << mat.step << std::endl;

出力

elemSize: 12
elemSize1: 4
step: 36
行列の型
  • type(): 型を取得する。
  • depth(): 深度を取得する。

std::cout << "type: " << mat.type() << std::endl;
std::cout << "depth: ";
switch (mat.depth()) {
    case CV_8U:
        std::cout << "CV_8U" << std::endl;
        break;
    case CV_8S:
        std::cout << "CV_8S" << std::endl;
        break;
    case CV_16U:
        std::cout << "CV_16U" << std::endl;
        break;
    case CV_16S:
        std::cout << "CV_16S" << std::endl;
        break;
    case CV_32S:
        std::cout << "CV_32S" << std::endl;
        break;
    case CV_32F:
        std::cout << "CV_32F" << std::endl;
        break;
    case CV_64F:
        std::cout << "CV_64F" << std::endl;
        break;
}

出力

type: 21
depth: CV_32F
行列の性質
  • isContinuous(): メモリ上にデータが連続して配置されているかどうかを取得する。
  • isSubmatrix(): 部分行列かどうかを取得する。
  • empty(): 空の配列かどうかを取得する。

std::cout << "isContinuous: " << mat.isContinuous() << std::endl;
std::cout << "isSubmatrix: " << mat.isSubmatrix() << std::endl;
std::cout << "empty: " << mat.empty() << std::endl;

出力

isContinuous: 1
isSubmatrix: 0
empty: 0