cvGetCol, cvGetRow, cvGetCols, cvGetRows, cvGetSubRectで行列の一部分だけを取り出すことができる

CvMat* cvGetCol(CvMat* src, CvMat* sub, int col);

幅1の列ベクトルをとってくる.

引数

  • src:CvMat*型の入力行列
  • sub:CvMat*型の部分行列
  • col:int型の列番号

返り値

  • CvMat*型の部分行列を示すポインタ

CvMat* cvGetRow(CvMat* src, CvMat* sub, int row);

高さ1の行ベクトルをとってくる.

引数

  • src:CvMat*型の入力行列
  • sub:CvMat*型の部分行列
  • row:int型の行番号

返り値

  • CvMat*型の部分行列を示すポインタ

CvMat* cvGetCols(CvMat* src, CvMat* sub, int start, int end );

幅end-startの行列を取ってくる

引数

  • src:CvMat*型の入力行列
  • sub:CvMat*型の部分行列
  • start:int型の範囲の始めの列番号
  • end:int型の範囲の終わりの列番号

返り値

  • CvMat*型の部分行列を示すポインタ

CvMat* cvGetRows(CvMat* src, CvMat* sub, int start, int end );

高さend-startの行列を取ってくる

引数

  • src:CvMat*型の入力行列
  • sub:CvMat*型の部分行列
  • start:int型の範囲の始めの行番号
  • end:int型の範囲の終わりの行番号

返り値

  • CvMat*型の部分行列を示すポインタ

CvMat* cvGetSubRect(CvMat* src, CvMat* sub, CvRect rect);

行列中の一部分を取ってくる

引数

  • src:CvMat*型の入力行列
  • sub:CvMat*型の部分行列
  • rect:CvRect型の部分座標

返り値

  • CvMat*型の部分行列を示すポインタ

解説

  • 範囲はstart_col<=i<end_col
  • cvGetRowもcvGetColも内部でcvGetRows,cvGetColsを利用している
  • 入力には画像も可能だが,出力は行列のみ
  • cvGetRows,cvGetCols,cvGetSubRectは全て
    • 参照渡しである.
    • よって,返された行列を編集すると原配列に影響する
    • 返り値はsubと同じポインタ.
  • ヘッダ部分だけを持つ別の変数を作る.
  • subは実体を持ったCvMat型(CvMat*型じゃなくて)のポインタが必要.
    • subはNULLじゃだめ
  • cvSetROIを使った場合はヘッダを書き加える

サンプルコード

  1.  IplImage *inputImage;
  2.  CvMat *inputMatrix, *subMatrix, stub;
  3.  
  4.  inputImage  = cvLoadImage(INPUT_FILE, CV_LOAD_IMAGE_GRAYSCALE);
  5.  inputMatrix = cvCreateMat(inputImage->height, inputImage->width, CV_8UC1);
  6.  cvCopy(inputImage, inputMatrix);                     // この関数は値渡し(コピー)
  7.  subMatrix   = cvGetRows(inputImage, &stub, 10, 20);  // 10行目-19行目をsubMatrixに格納(参照渡し,以下同じ)
  8.  subMatrix   = cvGetRow(inputMatrix, &stub, 10);      // 10行目をsubMatrixに格納
  9.  subMatrix   = cvGetCols(inputMatrix, &stub, 10, 20); // 10列目-19列目をsubMatrixに格納
  10.  subMatrix   = cvGetCol(inputImage, &stub, 10);       // 10列目をsubMatrixに格納
  11.  subMatrix   = cvGetSubRect(inputMatrix, &stub, cvRect(10, 10, 50, 50));
  12.                                                       // (10,10)-(60,60)をsubMatrixに格納
  13.  cvReleaseImage(&inputImage);
  14.  cvReleaseMat(&inputMatrix);
  15.  //cvReleaseMat(&subMatrix);  // Releaseしても大丈夫だが,通常は不要
  1.  CvMat *WorldCoordinates, *subMatrix, stub;
  2.  CvRect rect;
  3.  // 斉次座標で表された実空間の座標100個
  4.  WorldCoordinates = cvCreateMat(4, 100, CV_32FC1);
  5.  // WorldCoordinatesにデータをセット
  6.  FetchData(WorldCoordinates);
  7.  // 斉次座標を正規化
  8.  cvConvertPointsHomogenious(WorldCoordinates, WorldCoordinates);
  9.  // 範囲を指定(50番目から10個,3次元座標を取得)
  10.  // cvRect(x, y, width, height);の順に指定
  11.  rect      = cvRect(50, 0, 10, 3);
  12.  // ここで,subMatrixに部分行列が入る
  13.  subMatrix = cvGetSubRect(WorldCoordinates, &stub, rect);

実体ファイル

  • cxcore/include/cxcore.h
  • cxcore/src/cxarray.cpp

注意

  • srcに依ってsubを破壊することがありうる
  • 特に,srcに画像を使った場合のsubには要注意.typeが書き換えられている場合がある
  • 上記は参照渡しが原因
  • そもそもsrcには確保された配列ではなく,CvMat型を指定する.

ジャンル:OpenCV:OpenCV 1.0準拠


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-05-27 (木) 11:58:23 (2734d)