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]]準拠