×
現在地 >> メニュー >> OpenCV >> sequence編01
INDEX:sequence編00 << sequence編01 >> sequence編02

メモリストレージの作成と破棄

シーケンスを使用するには、シーケンスの格納場所、すなわちメモリストレージを先に作る。
【例】
CvMemStorage *storage;
storage = cvCreateMemStorage(); //デフォルトは1つあたり64kBのブロック

… …

//メモリストレージ開放
cvReleaseMemStorage( &storage ); //cvReleaseImageなどと同じようなもの
【解説】
メモリストレージは「ブロック」とよばれるものがリスト構造となっている。
この「ブロック」とよばれるところがデータが格納される領域。
■CvMemStorage*  cvCreateMemStorage( int block_size CV_DEFAULT(0));
メモリストレージを作成。
[ blockSize ] : バイト単位のストレージブロックサイズ

■void  cvReleaseMemStorage( CvMemStorage** storage );
メモリストレージを解放

シーケンスを作成する

シーケンスの作成は、cvCreateSeq関数を使う
【例】
CvSeq *sequance;
sequance = cvCreateSeq (CV_SEQ_ELTYPE_INDEX , sizeof (CvSeq), sizeof (int), storage); //シーケンス作成
【解説】
■CvSeq* cvCreateSeq(int seqFlags, int headerSize, int elemSize, CvMemStorage* storage)
シーケンスを作成する。
[seqFlag]:どんなタイプのシーケンスなのかを指定する。
[headerSize]:シーケンスのヘッダのサイズ。大抵は「sizeof(CvSeq)」。
[elemSize]:バイト単位でのシーケンスのサイズ
[storage]:シーケンスの格納場所
seqFlagには例えば以下のようなものが指定できる。
CV_SEQ_ELTYPE_POINTCV_32SC2CvPoint型
CV_SEQ_ELTYPE_CODECV_8UC1フリーマンコード(unsinged char型)
CV_SEQ_ELTYPE_PPOINTCV_SEQ_ELTYPE_PTR(ユーザ定義型)CvPoint型のポインタ等
CV_SEQ_ELTYPE_INDEXCV_32SC1インデックス型(32bit 符号付き整数型)
CV_SEQ_ELTYPE_POINT3DCV_32FC332bit浮動小数点の3要素(CvPoint3D32f型)
などなど...

シーケンスを削除する


シーケンスの削除には「cvClearSeq関数」を使う。
【例】
CvSeq *sequance;
sequance = cvCreateSeq (CV_SEQ_ELTYPE_INDEX , sizeof (CvSeq), sizeof (int), storage); //シーケンス作成
… …
cvClearSeq(sequance);//シーケンスの再利用可能だが、もうメモリとしては破棄

ここで注目したいのは、「cvClearSeq関数」の動作である。
この関数はシーケンスの全要素を削除し、そのメモリ領域をストレージブロックに返さない。
しかし後でこのシーケンスに要素を追加する際には、同じメモリ領域が使われる。

つまり、メモリ領域として使用する予約がされているが、
まだ具体的な確保をしていないのでデータを入れる事が出来ない状態。
(※std::vectorの「.reserve()」みたいなもの?)

シーケンスにデータを追加する

シーケンスに要素を追加する場合は、「cvSeqPush関数」や「cvSeqPushFront関数」がある。
【例】
CvSeq *sequance;
sequance = cvCreateSeq (CV_SEQ_ELTYPE_INDEX , sizeof (CvSeq), sizeof (int), storage); //シーケンス作成

int *a = new int[50000];

for(int loop = 0;loop < ElementNum;++loop)
{
	a[loop] = loop;
	cvSeqPush( sequance, &a[loop]); //データプッシュ
}
【解説】
■char* cvSeqPush(CvSeq*  seq, void* element=NULL)
シーケンスの末尾にデータを追加する。
[返り値]:追加したデータへのポインタ
[seq]:対象シーケンス
[element]:追加する要素

■char* cvSeqPushFront(CvSeq*  seq, void* element=NULL)
シーケンスの先頭にデータを追加する。
引数は同じ。

シーケンスの要素にアクセスする


シーケンスの内容にアクセスするには、「cvGetSeqElem関数」を使用する。
【例】
CvSeq *sequance;
sequance = cvCreateSeq (CV_SEQ_ELTYPE_INDEX , sizeof (CvSeq), sizeof (int), storage); //シーケンス作成
… …
int *num;
for( int i = 0; i<sequance->total; ++i ) 
{
	num = (int*)cvGetSeqElem ( sequance, i );
	printf("%d\n",*num);
}

あるいはマクロを使って、
std::cout << *CV_GET_SEQ_ELEM(int,sequance,i) << "\n";
のようにすることも可能。

サンプルコード

目次

― その他 ―

Wiki内検索

計測中...(07.10.8〜)

Save The World






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


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

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