最終更新:
mikk_ni3_92 2010年02月09日(火) 18:52:07履歴
現在地 >> メニュー >> OpenCV >> sequence編01
INDEX:sequence編00 << sequence編01 >> sequence編02
シーケンスの削除には「cvClearSeq関数」を使う。
【例】
ここで注目したいのは、「cvClearSeq関数」の動作である。
この関数はシーケンスの全要素を削除し、そのメモリ領域をストレージブロックに返さない。
しかし後でこのシーケンスに要素を追加する際には、同じメモリ領域が使われる。
つまり、メモリ領域として使用する予約がされているが、
まだ具体的な確保をしていないのでデータを入れる事が出来ない状態。
(※std::vectorの「.reserve()」みたいなもの?)
シーケンスの内容にアクセスするには、「cvGetSeqElem関数」を使用する。
【例】
あるいはマクロを使って、
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_POINT | CV_32SC2 | CvPoint型 |
CV_SEQ_ELTYPE_CODE | CV_8UC1 | フリーマンコード(unsinged char型) |
CV_SEQ_ELTYPE_PPOINT | CV_SEQ_ELTYPE_PTR(ユーザ定義型) | CvPoint型のポインタ等 |
CV_SEQ_ELTYPE_INDEX | CV_32SC1 | インデックス型(32bit 符号付き整数型) |
CV_SEQ_ELTYPE_POINT3D | CV_32FC3 | 32bit浮動小数点の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";のようにすることも可能。