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

#contents

*CvMat* cvGetCol(CvMat* src, CvMat* sub, int col); [#y50517c3]
幅1の列ベクトルをとってくる.
**引数 [#gd11672d]
-src:CvMat*型の入力行列
-sub:CvMat*型の部分行列
-col:int型の列番号
**返り値 [#pa56a49e]
-CvMat*型の部分行列を示すポインタ
*CvMat* cvGetRow(CvMat* src, CvMat* sub, int row); [#r09811e5]
高さ1の行ベクトルをとってくる.
**引数 [#o8df7a57]
-src:CvMat*型の入力行列
-sub:CvMat*型の部分行列
-row:int型の行番号
**返り値 [#b785c79d]
-CvMat*型の部分行列を示すポインタ
*CvMat* cvGetCols(CvMat* src, CvMat* sub, int start, int end ); [#xe12a6f9]
幅end-startの行列を取ってくる
**引数 [#c1a9c641]
-src:CvMat*型の入力行列
-sub:CvMat*型の部分行列
-start:int型の範囲の始めの列番号
-end:int型の範囲の終わりの列番号
**返り値 [#qa54ac5d]
-CvMat*型の部分行列を示すポインタ
*CvMat* cvGetRows(CvMat* src, CvMat* sub, int start, int end ); [#tc373cba]
高さend-startの行列を取ってくる
**引数 [#l31f7f1b]
-src:CvMat*型の入力行列
-sub:CvMat*型の部分行列
-start:int型の範囲の始めの行番号
-end:int型の範囲の終わりの行番号
**返り値 [#l37afebe]
-CvMat*型の部分行列を示すポインタ
*CvMat* cvGetSubRect(CvMat* src, CvMat* sub, CvRect rect); [#z4d1934c]
行列中の一部分を取ってくる
**引数 [#d6137393]
-src:CvMat*型の入力行列
-sub:CvMat*型の部分行列
-rect:CvRect型の部分座標
**返り値 [#e3124748]
-CvMat*型の部分行列を示すポインタ

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

*サンプルコード [#we91d3f0]

#geshi(c++,number){{
 IplImage *inputImage;
 CvMat *inputMatrix, *subMatrix, stub;
 
 inputImage  = cvLoadImage(INPUT_FILE, CV_LOAD_IMAGE_GRAYSCALE);
 inputMatrix = cvCreateMat(inputImage->height, inputImage->width, CV_8UC1);
 cvCopy(inputImage, inputMatrix);                     // この関数は値渡し(コピー)
 subMatrix   = cvGetRows(inputImage, &stub, 10, 20);  // 10行目-19行目をsubMatrixに格納(参照渡し,以下同じ)
 subMatrix   = cvGetRow(inputMatrix, &stub, 10);      // 10行目をsubMatrixに格納
 subMatrix   = cvGetCols(inputMatrix, &stub, 10, 20); // 10列目-19列目をsubMatrixに格納
 subMatrix   = cvGetCol(inputImage, &stub, 10);       // 10列目をsubMatrixに格納
 subMatrix   = cvGetSubRect(inputMatrix, &stub, cvRect(10, 10, 50, 50));
                                                      // (10,10)-(60,60)をsubMatrixに格納
 cvReleaseImage(&inputImage);
 cvReleaseMat(&inputMatrix);
 //cvReleaseMat(&subMatrix);  // Releaseしても大丈夫だが,通常は不要
}}

#geshi(c++,number){{
 CvMat *WorldCoordinates, *subMatrix, stub;
 CvRect rect;
 // 斉次座標で表された実空間の座標100個
 WorldCoordinates = cvCreateMat(4, 100, CV_32FC1);
 // WorldCoordinatesにデータをセット
 FetchData(WorldCoordinates);
 // 斉次座標を正規化
 cvConvertPointsHomogenious(WorldCoordinates, WorldCoordinates);
 // 範囲を指定(50番目から10個,3次元座標を取得)
 // cvRect(x, y, width, height);の順に指定
 rect      = cvRect(50, 0, 10, 3);
 // ここで,subMatrixに部分行列が入る
 subMatrix = cvGetSubRect(WorldCoordinates, &stub, rect);
}}

*実体ファイル [#n3188a64]
-cxcore/include/cxcore.h
-cxcore/src/cxarray.cpp

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

ジャンル[[:OpenCV]][[:OpenCV 1.0]]準拠

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS