root/lang/cpluspluscli/OpenCvSharp2/trunk/OpenCvSharp/CvArr/CvSeq.cs @ 32273

Revision 32273, 20.0 kB (checked in by schima, 4 years ago)

CvContourTree?

Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Runtime.InteropServices;
5using System.Text;
6
7namespace KwsmLab.OpenCvSharp
8{
9    /// <summary>
10    /// 拡張可能な要素のシーケンス
11    /// </summary>
12    public class CvSeq : CvArr, ICloneable
13    {
14        /// <summary>
15        /// C++/CLI access to object's pointer
16        /// </summary>
17        protected Extern.WCvSeq _data;
18        /// <summary>
19        /// Data pointer
20        /// </summary>
21        protected IntPtr _ptr;
22
23
24        #region Init and Disposal
25        /// <summary>
26            /// cvCreateSeqによる初期化. header_size=sizeof(CvSeq)
27            /// </summary>
28            /// <param name="seq_flags">生成されたシーケンスのフラグ.生成されたシーケンスが,特定のシーケンスタイプを引数にとるような関数に一切渡されない場合は,この値に0を指定してもかまわない.</param>
29        /// <param name="elem_size">要素のバイトサイズ</param>
30        /// <param name="storage">シーケンスが保存される場所</param>
31            /// <returns></returns>
32            public CvSeq( SeqType seq_flags, int elem_size, CvMemStorage storage )
33            : this(seq_flags, SizeOf, elem_size, storage)
34            {
35            }
36        /// <summary>
37        /// cvCreateSeqによる初期化.
38        /// この関数は,シーケンスヘッダをストレージ内の連続した一つのブロックとして領域確保し,
39        /// 引数として渡された値を構造体のフィールド flags,elem_size, header_size,storageに引数で渡した値をセットする.
40        /// そして,delta_elems にデフォルト値(関数 cvSetSeqBlockSize で再設定できる)をセットし,
41        /// その他のヘッダフィールド(先頭から sizeof(CvSeq) バイト以降のスペースも含む)をクリアする.
42        /// </summary>
43        /// <param name="seq_flags">生成されたシーケンスのフラグ.生成されたシーケンスが,特定のシーケンスタイプを引数にとるような関数に一切渡されない場合は,この値に0を指定してもかまわない.</param>
44        /// <param name="header_size">シーケンスのヘッダサイズ.sizeof(CvSeq)以上でなければならない. また,特別なタイプかその拡張が指示されている場合,そのタイプは基本タイプのヘッダと合致していなければならない.</param>
45        /// <param name="elem_size">要素のバイトサイズ</param>
46        /// <param name="storage">シーケンスが保存される場所</param>
47        /// <returns></returns>
48        public CvSeq(SeqType seq_flags, int header_size, int elem_size, CvMemStorage storage)
49        {
50            if (storage == null)
51            {
52                throw new ArgumentNullException();
53            }
54            this._ptr = CvDll.cvCreateSeq(seq_flags, header_size, elem_size, storage.CvPtr);
55            if (this._ptr == IntPtr.Zero)
56            {
57                throw new Exception("CvSeqのインスタンスの生成に失敗しました.");
58            }
59            this._data = new Extern.WCvSeq(this._ptr);
60        }
61        /// <summary>
62        /// ポインタから初期化
63        /// </summary>
64        /// <param name="ptr"></param>
65        public CvSeq(IntPtr ptr)
66        {
67            this._ptr = ptr;
68            this._data = new Extern.WCvSeq(ptr);
69        }
70        /// <summary>
71        /// リソースの解放
72        /// </summary>
73        public override void Dispose()
74        {
75            // CvSeqは解放しない
76            base.Dispose();
77        }
78        #endregion
79
80
81        #region プロパティ
82        /// <summary>
83        /// sizeof(CvSeq) を取得する
84        /// </summary>
85        public const Int32 SizeOf = Extern.WCvSeq.SizeOf;
86        /// <summary>
87        /// データポインタ(CvSeq*)を取得する
88        /// </summary>
89        public override IntPtr CvPtr
90        {
91            get { return _ptr; }
92        }
93
94        /// <summary>
95                /// 様々なフラグ
96                /// </summary>
97                public int Flags{
98                        get { return _data.flags; }
99                }
100                /// <summary>
101                /// シーケンスのヘッダサイズ
102                /// </summary>
103                public int HeaderSize{
104                        get { return _data.header_size; }
105                }
106                /// <summary>
107                /// 一つ前のシーケンスへのポインタ
108                /// </summary>
109                public CvSeq HPrev{
110                        get {
111                IntPtr ptr = _data.h_prev;
112                                if(ptr != IntPtr.Zero){
113                                        return new CvSeq(ptr);
114                                }else{
115                                        return null;
116                                }
117                        }
118                }
119                /// <summary>
120                /// 一つ後のシーケンスへのポインタ
121                /// </summary>
122                public CvSeq HNext{
123                        get {
124                IntPtr ptr = _data.h_next;
125                                if(ptr != IntPtr.Zero){
126                                        return new CvSeq(ptr);
127                                }else{
128                                        return null;
129                                }
130                        }
131                }
132                /// <summary>
133                /// 一つ前のシーケンスへのポインタ(セカンダリ,構造によって意味が異なる)
134                /// </summary>
135                public CvSeq VPrev{
136                        get {
137                            IntPtr ptr = _data.v_prev;
138                                if(ptr != IntPtr.Zero){
139                                        return new CvSeq(ptr);
140                                }else{
141                                        return null;
142                                }
143                        }
144                }
145                /// <summary>
146                /// 一つ後のシーケンスへのポインタ(セカンダリ,構造によって意味が異なる)
147                /// </summary>
148                public CvSeq VNext{
149                        get {
150                IntPtr ptr = _data.v_next;
151                                if(ptr != IntPtr.Zero){
152                                        return new CvSeq(ptr);
153                                }else{
154                                        return null;
155                                }
156                        }
157                }
158                /// <summary>
159                /// 要素の総数
160                /// </summary>
161                public int Total{
162                        get { return _data.total; }
163                }
164                /// <summary>
165                /// シーケンス要素のサイズ(バイト単位)
166                /// </summary>
167                public int ElemSize{
168                        get { return _data.elem_size; }
169                }
170                /// <summary>
171                /// 最新のブロックの最大値
172                /// </summary>
173                public IntPtr BlockMax{
174                        get { return _data.block_max; }
175                }
176                /// <summary>
177                /// 現在の書き込みポインタ
178                /// </summary>
179                public IntPtr Ptr{
180                        get { return _data.ptr; }
181                }
182                /// <summary>
183                /// シーケンスを拡張させる際に,領域確保する要素数(シーケンスの粒度)
184                /// </summary>
185                public int DeltaElems{
186                        get { return _data.delta_elems; }
187                }
188                /// <summary>
189                /// seqが保存される領域
190                /// </summary>
191                public CvMemStorage Storage{
192                        get {
193                IntPtr ptr = _data.storage;
194                                if(ptr != IntPtr.Zero){
195                                        return new CvMemStorage(ptr, false);
196                                }else{
197                                        return null;
198                                }
199                        }
200                }
201                /// <summary>
202                /// 空きブロックリスト
203                /// </summary>
204                public CvSeqBlock FreeBlocks{
205                        get {
206                IntPtr ptr = _data.free_blocks;
207                                if(ptr != IntPtr.Zero){
208                                        return new CvSeqBlock(ptr);
209                                }else{
210                                        return null;
211                                }
212                        }
213                }
214                /// <summary>
215                /// 先頭シーケンスブロックへのポインタ
216                /// </summary>
217                public CvSeqBlock First{
218                        get {
219                    IntPtr ptr = _data.first;
220                                if(ptr != IntPtr.Zero){
221                                        return new CvSeqBlock(ptr);
222                                }else{
223                                        return null;
224                                }       
225                        }
226                }
227
228        #endregion
229
230
231        #region OpenCV メソッド
232        #region Clear
233            /// <summary>
234            /// 与えられたインデックスをもつ要素を削除する (cvClearSeq相当)
235            /// </summary>
236        public virtual void Clear()
237        {
238            Cv.ClearSeq(this);
239        }
240            #endregion
241        #region Clone
242        /// <summary>
243        /// ヘッダ,ROI,データを含む画像の完全なコピーを作成する(cvCloneSeq相当)
244        /// </summary>
245        /// <returns>この画像の完全なコピー</returns>
246        public virtual CvSeq Clone()
247        {
248            return Cv.CloneSeq(this);
249        }
250        /// <summary>
251        /// 入力行列のコピーを作成し返す
252        /// </summary>
253        /// <param name="storage">新しいシーケンスヘッダとコピーされたデータ(もしデータがあれば)を保存する出力ストレージ. nullの場合,入力シーケンスに含まれるストレージを使用する.</param>
254        /// <returns>コピーされたCvSeq</returns>
255        public virtual CvSeq Clone(CvMemStorage storage)
256        {
257            return Cv.CloneSeq(this, storage);
258        }
259        /// <summary>
260        ///
261        /// </summary>
262        /// <returns></returns>
263        object ICloneable.Clone()
264        {
265            return Clone();
266        }
267        #endregion
268        #region GetElem
269        /// <summary>
270        /// 与えられたインデックスを持つ要素をシーケンスの中から求め,その要素を返す.
271        /// </summary>
272        /// <param name="index">要素のインデックス. 負のインデックスの指定も可能で, 例えば,-1はシーケンスの最後の要素,-2は最後の一つ前を指す.</param>
273        /// <returns>与えられたインデックスを持つ要素.要素が見つからない場合はnull.</returns>
274        public virtual T? GetElem<T>(int index) where T : struct
275        {
276            return Cv.GetSeqElem<T>(this, index);
277        }
278        #endregion
279        #region Insert
280            /// <summary>
281            /// シーケンス内の要素を指定した挿入位置から近い側のシーケンスの端にシフトし,element の内容をその位置にコピーする (cvSeqInsert相当).
282            /// 挿入された要素への参照を返す.
283            /// </summary>
284            /// <param name="before_index">要素が挿入されるインデックス(このインデックスの前に挿入される)</param>
285            /// <param name="element">追加される要素. プリミティブ型か、OpenCVの構造体(CvPointなど).</param>
286            /// <returns>追加された要素</returns>
287        public virtual T Insert<T>(int before_index, T element) where T : struct
288            {
289                    return Cv.SeqInsert<T>(this, before_index, element);
290            }
291            #endregion
292        #region Remove
293            /// <summary>
294            /// 与えられたインデックスをもつ要素を削除する (cvSeqRemove相当)
295            /// </summary>
296            /// <param name="index">削除される要素のインデックス</param>
297            public virtual void Remove( int index )
298            {
299                    Cv.SeqRemove(this, index);
300            }
301            #endregion
302        #region Pop
303        /// <summary>
304        /// シーケンスの末尾から一つの要素を削除する.
305        /// シーケンスが既に空の場合は,エラーを返す.この関数の計算量は O(1) である.
306        /// </summary>
307        public virtual T Pop<T>() where T : struct
308        {
309            T result;
310            Cv.SeqPop<T>(this, out result);
311            return result;
312        }
313        #endregion
314        #region PopFront
315        /// <summary>
316        /// シーケンスの先頭から一つの要素を削除する (cvSeqPopFront相当).
317        /// シーケンスが既に空の場合は,エラーを返す.この関数の計算量は O(1) である.
318        /// </summary>
319        /// <returns>削除された要素</returns>
320        public virtual T PopFront<T>() where T : struct
321        {
322            T result;
323            Cv.SeqPopFront<T>(this, out result);
324            return result;
325        }
326        #endregion
327        #region Push
328        /// <summary>
329        /// シーケンスの末尾に要素一つ分の領域を確保する.
330        /// </summary>
331        /// <returns>追加された要素へのポインタ</returns>
332        public virtual IntPtr Push()
333        {
334            return Cv.SeqPush(this);
335        }
336        /// <summary>
337        /// シーケンスの末尾に要素を追加し,割り付けられた要素を返す.
338        /// 入力の element が null の場合,この関数は単に要素一つ分の領域を確保する.
339        /// </summary>
340        /// <param name="element">追加される要素. プリミティブ型か、OpenCVの構造体(CvPointなど).</param>
341        /// <returns>追加された要素へのポインタ</returns>
342        public virtual T Push<T>(T element) where T : struct
343        {
344            return Cv.SeqPush<T>(this, element);
345        }
346        #endregion
347        #region PushFront
348            /// <summary>
349            /// シーケンスの先頭に要素を追加し,割り付けられた要素を返す (cvSeqPushFront相当).
350            /// </summary>
351            /// <param name="element">追加される要素. プリミティブ型か、OpenCVの構造体(CvPointなど).</param>
352            /// <returns>追加された要素</returns>
353        public virtual T PushFront<T>(T element) where T : struct
354            {
355                    return Cv.SeqPushFront<T>(this, element);
356            }
357            #endregion
358            #region Search
359            /// <summary>
360            /// シーケンスの中から要素を検索する (cvSeqSearch相当).
361            /// シーケンスがソートされていれば,O(log(N))の二分探索法が用いられる.その他の場合は,単純な線形探索が用いられる.
362            /// 要素が見つからない場合,この関数はnullを返し,インデックスにはシーケンスの要素数をセットする.
363            /// 線形探索を用いて要素を見つけた場合,インデックスにはseq(i)>elemである最小のインデックスiがセットされる.
364            /// </summary>
365            /// <param name="elem">検索する要素</param>
366            /// <param name="func">要素の関係に応じて,負・0・正の値を返す比較関数</param>
367            /// <param name="is_sorted">シーケンスがソート済みか否かを示すフラグ</param>
368            /// <param name="elem_idx">出力パラメータ.見つかった要素のインデックス.</param>
369            public virtual IntPtr Search( IntPtr elem, CvCmpFunc func, bool is_sorted, out int elem_idx )
370            {
371            return Cv.SeqSearch(this, elem, func, is_sorted, out elem_idx);
372            }
373            #endregion
374            #region SetBlockSize
375            /// <summary>
376            /// メモリ確保サイズを指定する (cvcvSetSeqBlockSize相当).
377            /// シーケンスバッファ上の空き領域を使い果たした場合,関数は delta_elems シーケンス要素分の領域確保を行う.
378            /// 確保したブロックが前のブロックの直後になる場合,二つのブロックは接続されるが,それ以外では,新しいシーケンスブロックが生成される.
379            /// そのため,このパラメータを大きくすることによってシーケンスブロックの断片化は押さえられるものの,ストレージ中の多くのスペースが浪費されることになる.
380            /// シーケンス生成時に,パラメータ delta_elems にはデフォルト値≈1K がセットされる.シーケンス生成後,この関数をいつでも呼ぶことができ,
381            /// 以降の領域確保の際にその値が使われる.この関数によって,渡されたパラメータ値をメモリストレージの制限に合わせるために変更することができる.
382            /// </summary>
383            /// <param name="delta_elems">シーケンス要素のブロックサイズ</param>
384            public virtual void SetBlockSize( int delta_elems )
385            {
386                    Cv.SetSeqBlockSize(this, delta_elems);
387            }
388            #endregion
389        #region Slice
390        /// <summary>
391        /// シーケンススライスのための別のヘッダを作成する
392        /// </summary>
393        /// <param name="slice">抽出するシーケンスの一部分</param>
394        /// <returns></returns>
395        public virtual CvSeq Slice(CvSlice slice)
396        {
397            return Cv.SeqSlice(this, slice);
398        }
399        /// <summary>
400        /// シーケンススライスのための別のヘッダを作成する
401        /// </summary>
402        /// <param name="slice">抽出するシーケンスの一部分</param>
403        /// <param name="storage">新しいシーケンスヘッダとコピーされたデータ(もしデータがあれば)を保存する出力ストレージ. nullの場合,この関数は入力シーケンスに含まれるストレージを使用する</param>
404        /// <returns></returns>
405        public virtual CvSeq Slice(CvSlice slice, CvMemStorage storage)
406        {
407            return Cv.SeqSlice(this, slice, storage);
408        }
409        /// <summary>
410        /// シーケンススライスのための別のヘッダを作成する
411        /// </summary>
412        /// <param name="slice">抽出するシーケンスの一部分</param>
413        /// <param name="storage">新しいシーケンスヘッダとコピーされたデータ(もしデータがあれば)を保存する出力ストレージ. nullの場合,この関数は入力シーケンスに含まれるストレージを使用する</param>
414        /// <param name="copy_data">抽出されたスライスの要素をコピーするかしないかを示すフラグ</param>
415        /// <returns></returns>
416        public virtual CvSeq Slice(CvSlice slice, CvMemStorage storage, bool copy_data)
417        {
418            return Cv.SeqSlice(this, slice, storage, copy_data);
419        }
420        #endregion
421            #region Sort
422            /// <summary>
423            /// シーケンスの要素を,指定した比較関数を用いてソートする (cvSeqSort相当)
424            /// </summary>
425            /// <param name="func">要素の関係に応じて,負・0・正の値を返す比較関数</param>
426            public virtual void Sort( CvCmpFunc func )
427            {
428                    Cv.SeqSort(this, func);
429            }
430            #endregion
431        #region StartRead
432            /// <summary>
433            /// リーダの状態を初期化する.
434            /// この後,先頭から末尾までの全シーケンス要素は,続いて呼ばれるマクロCV_READ_SEQ_ELEM( read_elem, reader )(順方向読み出しの場合)
435            /// あるいは,マクロ CV_REV_READ_SEQ_ELEM( read_elem, reader )(逆方向読み出しの場合)を用いて,読み出しが可能になる.
436            /// </summary>
437            /// <param name="reader">リーダ(reader)の状態.この関数で初期化される.</param>
438        public virtual void StartRead(CvSeqReader reader)
439            {
440                    Cv.StartReadSeq(this, reader);
441            }
442            /// <summary>
443            /// リーダの状態を初期化する.
444            /// この後,先頭から末尾までの全シーケンス要素は,続いて呼ばれるマクロCV_READ_SEQ_ELEM( read_elem, reader )(順方向読み出しの場合)
445            /// あるいは,マクロ CV_REV_READ_SEQ_ELEM( read_elem, reader )(逆方向読み出しの場合)を用いて,読み出しが可能になる.
446            /// </summary>
447            /// <param name="reader">リーダ(reader)の状態.この関数で初期化される.</param>
448            /// <param name="reverse">シーケンス走査方向の指定.reverse が false の場合,リーダは先頭のシーケンス要素に位置する.それ以外は最後の要素に位置する.</param>
449        public virtual void StartRead(CvSeqReader reader, bool reverse)
450            {
451                    Cv.StartReadSeq(this, reader, reverse);
452            }
453            #endregion
454        #region ToArray
455        /// <summary>
456        /// シーケンスをメモリ内の連続した一つのブロックにコピーする
457        /// </summary>
458        /// <returns>出力される配列</returns>
459        public T[] ToArray<T>() where T : struct
460        {
461            T[] elements;
462            return Cv.CvtSeqToArray<T>(this, out elements);
463        }
464        /// <summary>
465        /// シーケンスをメモリ内の連続した一つのブロックにコピーする
466        /// </summary>
467        /// <param name="slice">配列へコピーするシーケンス内の部分</param>
468        /// <returns>出力される配列. outされる引数 element と同じ値.</returns>
469        public T[] ToArray<T>(CvSlice slice) where T : struct
470        {
471            T[] elements;
472            return Cv.CvtSeqToArray<T>(this, out elements, slice);
473        }
474        #endregion
475        #endregion
476
477    }
478}
Note: See TracBrowser for help on using the browser.