現在地 >> メニュー >> OpenCV >> IplImage編02 >> IplImage編02::間接アクセス
関連:IplImage編02::直接アクセス


間接アクセス


関数を経由してデータにアクセスする場合は
  • 記述はわかりやすく、安全
  • 効率が悪い
という特徴がある。

データ取得


データ取得のための関数には、
  • cvPtr*D関数 ⇒ ポインタを取得
  • cvGetReal*D関数
  • cvGet*D関数
がある。

cvPtr*D関数

この関数は、指定したピクセル座標に対応するデータのポインタを返す。

【注意点】
idx0,idx1...とx,y,...の対応順に注意。

CVAPI(uchar*) cvPtr1D( const CvArr* arr, int idx0, int* type CV_DEFAULT(NULL));

//(idx0, idx1) = (y, xに該当)
CVAPI(uchar*) cvPtr2D( const CvArr* arr, int idx0, int idx1, int* type CV_DEFAULT(NULL) ); 

//(idx0, idx1,idx2) = (z, y, xに該当)
CVAPI(uchar*) cvPtr3D( const CvArr* arr, int idx0, int idx1, int idx2, int* type CV_DEFAULT(NULL));

CVAPI(uchar*) cvPtrND( const CvArr* arr, const int* idx, int* type CV_DEFAULT(NULL),
                      int create_node CV_DEFAULT(1),
                      unsigned* precalc_hashval CV_DEFAULT(NULL));

【例】座標:(99,49)の画素値を出力
//(x,y)=(99,49)のピクセルの画素値
unsigned char *tmp1;
tmp1 = cvPtr2D(imgA,49,99);//(99,49)
printf("(99,49) = %d\n",*tmp1);

cvGetReal*D関数


チャネル数が1ならば、「cvGetReal*D関数」が使える。
CVAPI(double) cvGetReal1D( const CvArr* arr, int idx0 );

//idx0 = y, idx1 = xが対応する
CVAPI(double) cvGetReal2D( const CvArr* arr, int idx0, int idx1 );

//idx0 = z, idx1 = y, idx2 = xが対応する
CVAPI(double) cvGetReal3D( const CvArr* arr, int idx0, int idx1, int idx2 );

CVAPI(double) cvGetRealND( const CvArr* arr, const int* idx );

cvGet*D関数


RGBの3色などマルチチャネルの場合は、「cvGet*D関数」を使う。
CvScalar cvGet1D( const CvArr* arr, int idx0 );

//(idx0,idx1)=(y,x)
CvScalar cvGet2D( const CvArr* arr, int idx0, int idx1 ); 

//(idx0,idx1,idx2)=(z,y,x)
CvScalar cvGet3D( const CvArr* arr, int idx0, int idx1, int idx2 );

CvScalar cvGetND( const CvArr* arr, const int* idx );

※CvScalar型

CvScalar型は次のような定義となっている。
【定義】
typedef struct CvScalar
{
    double val[4];
}
CvScalar;

CvScalar型に関連して値設定には
//各要素に値を設定
CvScalar  cvScalar( double val0, double val1 CV_DEFAULT(0),double val2 CV_DEFAULT(0), double val3 CV_DEFAULT(0))

//val[0]に値を設定。他は0を設定
CvScalar  cvRealScalar( double val0 )

//全ての要素に同じ値を設定
CvScalar  cvScalarAll( double val0123 )

//マクロ
#define CV_RGB( r, g, b )  cvScalar( (b), (g), (r), 0 )
がある。


データ代入

cvSetReal*D関数

画像データが1チャネルの時は、cvSetReal*D関数で値を書き込むことができる。

idx0,idx1...の順番にはこれまでと同じく注意。

CVAPI(void) cvSetReal1D( CvArr* arr, int idx0, double value );
CVAPI(void) cvSetReal2D( CvArr* arr, int idx0, int idx1, double value );
CVAPI(void) cvSetReal3D( CvArr* arr, int idx0,int idx1, int idx2, double value );
CVAPI(void) cvSetRealND( CvArr* arr, const int* idx, double value );

cvSet*D関数


RGB3色などのマルチチャネルの時は、cvSet*D関数を使う。
CVAPI(void) cvSet1D( CvArr* arr, int idx0, CvScalar value );
CVAPI(void) cvSet2D( CvArr* arr, int idx0, int idx1, CvScalar value );
CVAPI(void) cvSet3D( CvArr* arr, int idx0, int idx1, int idx2, CvScalar value );
CVAPI(void) cvSetND( CvArr* arr, const int* idx, CvScalar value );

サンプルコード


データ取得

データ代入

目次

― その他 ―

Wiki内検索

計測中...(07.10.8〜)

Save The World






▲よろしければ広告のクリックもお願いします


▲ランキングに参加しました

管理人/副管理人のみ編集できます