root/lang/cpluspluscli/OpenCvSharp2/trunk/OpenCvSharp/HighGUI/CvWindow.cs @ 31346

Revision 31346, 12.2 kB (checked in by schima, 4 years ago)

画像ピラミッド関係の関数を実装

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    /// cvNamedWindow関数によるHighGUIウィンドウのラッパー
11    /// </summary>
12    public class CvWindow : DisposableObject
13    {
14        static internal Dictionary<string, CvWindow> Windows = new Dictionary<string, CvWindow>();
15        static private int windowCount = 0;
16
17                private string name;
18                private CvArr image;
19                private CvMouseCallbackHandler mouseCallback;
20                private Dictionary<string, CvTrackbar> trackbars;
21
22        #region 初期化と解放
23        /// <summary>
24        /// 適当なウィンドウ名で初期化
25        /// </summary>
26        public CvWindow()
27            : this(DefaultName(), WindowMode.AutoSize, null)
28        {
29        }       
30        /// <summary>
31        /// 適当なウィンドウ名で、始めから表示しておく画像を指定して初期化
32        /// </summary>
33        /// <param name="image">ウィンドウに表示する画像</param>
34        public CvWindow(CvArr image)
35            : this(DefaultName(), WindowMode.AutoSize, image)
36        {
37        }
38        /// <summary>
39        /// 適当なウィンドウ名で、画像の表示モードを指定して初期化
40        /// </summary>
41        /// <param name="flags">ウィンドウのフラグ</param>
42        /// <param name="image">ウィンドウに表示する画像</param>
43                public CvWindow(WindowMode flags, CvArr image)
44            : this(DefaultName(), flags, image)
45        {
46        }
47        /// <summary>
48        /// ウィンドウ名を指定して初期化
49        /// </summary>
50        /// <param name="name">ウィンドウの識別に用いられるウィンドウ名で,ウィンドウのタイトルバ ーに表示される.</param>
51                public CvWindow(string name)
52            : this(name, WindowMode.AutoSize, null)
53        {
54        }
55        /// <summary>
56        /// ウィンドウ名と画像の表示モードを指定して初期化
57        /// </summary>
58        /// <param name="name">ウィンドウの識別に用いられるウィンドウ名で,ウィンドウのタイトルバ ーに表示される.</param>
59        /// <param name="flags">ウィンドウのフラグ</param>
60                public CvWindow(string name, WindowMode flags)
61            : this(name, flags, null)
62        {
63        }
64        /// <summary>
65        /// ウィンドウ名と始めから表示しておく画像を指定して初期化
66        /// </summary>
67        /// <param name="name">ウィンドウの識別に用いられるウィンドウ名で,ウィンドウのタイトルバ ーに表示される.</param>
68        /// <param name="image">ウィンドウに表示する画像</param>
69        public CvWindow(string name, CvArr image)
70            : this(name, WindowMode.AutoSize, image)
71        {
72        }
73        /// <summary>
74        /// ウィンドウ名と画像の表示モードと始めから表示しておく画像を指定して初期化
75        /// </summary>
76        /// <param name="name">ウィンドウの識別に用いられるウィンドウ名で,ウィンドウのタイトルバ ーに表示される.</param>
77        /// <param name="flags">ウィンドウのフラグ</param>
78        /// <param name="image">ウィンドウに表示する画像</param>
79        public CvWindow(string name, WindowMode flags, CvArr image)
80        {
81            if (name == null)
82            {
83                throw new OpenCvSharpException("ウィンドウ名をnullにはできません。", new ArgumentNullException());
84            }
85            this.name = name;
86            int status = CvDll.cvNamedWindow(name, flags);
87            if (status == 0)
88            {
89                throw new OpenCvSharpException("CvWindowの生成に失敗しました.");
90            }
91            this.image = image;
92            ShowImage(image);
93            this.trackbars = new Dictionary<string, CvTrackbar>();
94            if (!Windows.ContainsKey(name))
95            {
96                Windows.Add(name, this);
97            }
98        }
99        /// <summary>
100        /// ウィンドウ名が指定されなかったときに、適当な名前を作成して返す.
101        /// </summary>
102        /// <returns></returns>
103        static private string DefaultName()
104        {
105            return string.Format("window{0}", windowCount++);
106        } 
107
108        /// <summary>
109        /// リソースの解放
110        /// </summary>
111        public override void Dispose()
112        {
113            Close();
114        }
115        /// <summary>
116        /// ウィンドウを閉じる
117        /// </summary>
118        public void Close()
119        {
120            if (!IsDisposed)
121            {
122                CvDll.cvDestroyWindow(name);
123                foreach (KeyValuePair<string, CvTrackbar> pair in trackbars)
124                {
125                    if (pair.Value != null)
126                    {
127                        pair.Value.Dispose();
128                    }
129                }
130                try
131                {
132                    Windows.Remove(name);
133                }
134                catch (Exception) { }               
135            }
136            base.Dispose();
137        }
138
139        /// <summary>
140            /// 全ての HighGUI ウィンドウを破棄する
141            /// </summary>
142            public static void DestroyAllWindows( )
143            {
144                    foreach(KeyValuePair<string, CvWindow> wpair in Windows){
145                            CvWindow w = wpair.Value;
146                            if(w == null || w.IsDisposed){
147                                    continue;
148                            }
149                            CvDll.cvDestroyWindow(w.name);
150                            foreach(KeyValuePair<string, CvTrackbar> tpair in w.trackbars){
151                                    if(tpair.Value != null){
152                                            tpair.Value.Dispose();
153                                    }
154                            }
155                //w.Dispose();
156                    }
157                    Windows.Clear();
158            CvDll.cvDestroyAllWindows();
159            }
160        #endregion
161
162        #region プロパティ
163        /// <summary>
164                /// 表示する画像を取得・設定する
165                /// </summary>
166        public CvArr Image
167        {
168            get { return image; }
169            set { ShowImage(value); }
170        }
171        /// <summary>
172                /// ウィンドウの名前を取得する
173                /// </summary>
174        public string Name
175        {
176            get { return name; }
177            private set { name = value; }
178        }
179                /// <summary>
180                /// ウィンドウハンドルを取得する
181                /// </summary>
182        public IntPtr Handle
183        {
184            get { return CvDll.cvGetWindowHandle(name); }
185        }
186        /// <summary>
187                /// マウスイベントが発生したときのイベントハンドラ
188                /// </summary>
189                public event CvMouseCallbackHandler OnMouseCallback{
190                        add{
191                                mouseCallback += value;
192                CvDll.cvSetMouseCallback(name, mouseCallback);
193                        }
194                        remove{
195                                mouseCallback -= value;
196                                CvDll.cvSetMouseCallback(name, mouseCallback);
197                        }
198                }
199        #endregion
200
201        #region メソッド
202        /// <summary>
203        /// ウィンドウにトラックバーを作成し、作成したトラックバーを返す
204        /// </summary>
205        /// <param name="name">トラックバーの名前</param>
206        public CvTrackbar CreateTrackbar(string name)
207        {
208            CvTrackbar trackbar = new CvTrackbar(name, this.name);
209            trackbars.Add(name, trackbar);
210            return trackbar;
211        }
212        /// <summary>
213        /// ウィンドウにトラックバーを作成し、作成したトラックバーを返す
214        /// </summary>
215        /// <param name="name">トラックバーの名前</param>
216        /// <param name="callback">スライダの位置が変更されるたびに呼び出されるデリゲート</param>
217        public CvTrackbar CreateTrackbar(string name, CvTrackbarCallbackHandler callback)
218        {
219            CvTrackbar trackbar = new CvTrackbar(name, this.name, callback);
220            trackbars.Add(name, trackbar);
221            return trackbar;
222        }
223        /// <summary>
224        /// ウィンドウにトラックバーを作成し、作成したトラックバーを返す
225        /// </summary>
226        /// <param name="name">トラックバーの名前</param>
227        /// <param name="value">スライダの位置.</param>
228        /// <param name="max">スライダの最大値.最小値は常に 0.</param>
229        public CvTrackbar CreateTrackbar(string name, int value, int max)
230        {
231            CvTrackbar trackbar = new CvTrackbar(name, this.name, value, max);
232            trackbars.Add(name, trackbar);
233            return trackbar;
234        }
235        /// <summary>
236        /// ウィンドウにトラックバーを作成し、作成したトラックバーを返す
237        /// </summary>
238        /// <param name="name">トラックバーの名前</param>
239        /// <param name="value">スライダの初期位置</param>
240        /// <param name="max">スライダの最大値.最小値は常に 0.</param>
241        /// <param name="callback">スライダの位置が変更されるたびに呼び出されるデリゲート</param>
242        public CvTrackbar CreateTrackbar(string name, int value, int max, CvTrackbarCallbackHandler callback)
243        {
244            CvTrackbar trackbar = new CvTrackbar(name, this.name, value, max, callback);
245            trackbars.Add(name, trackbar);
246            return trackbar;
247        }
248        /// <summary>
249            /// 指定したウィンドウ内に画像を表示する(cvShowImage相当).
250            /// このウィンドウのフラグに AutoSize が指定されていた場合は,画像はオリジナルサイズで表示される.
251            /// それ以外の場合,ウィンドウサイズに合わせて 表示画像サイズが変更される.
252            /// </summary>
253            /// <param name="img">画像ヘッダ</param>
254        public void ShowImage(CvArr img)
255        {
256            if (img != null)
257            {
258                this.image = img;
259                CvDll.cvShowImage(name, img.CvPtr);
260            }
261        }       
262            /// <summary>
263            /// ウィンドウの位置を変更する
264            /// </summary>
265            /// <param name="x">左上のコーナーの新しい x 座標</param>
266            /// <param name="y">左上のコーナーの新しい y 座標</param>
267            public void Move(int x, int y)
268            {
269                    CvDll.cvMoveWindow(name, x, y);
270            }
271
272            /// <summary>
273            /// ウィンドウサイズを変更する
274            /// </summary>
275            /// <param name="width">新しい幅</param>
276            /// <param name="height">新しい高さ</param>
277            public void Resize(int width, int height)
278            {
279                    CvDll.cvResizeWindow(name, width, height);
280            }
281
282        /// <summary>
283            /// 何かキーが押されるまで待機する.
284            /// </summary>
285            /// <returns>押されたキーのキーコード</returns>
286            static public int WaitKey()
287            {
288                    return CvDll.cvWaitKey(0);
289            }
290            /// <summary>
291            /// 何かキーが押されるか、若しくはdelayで指定した時間(ミリ秒)待機する。
292            /// </summary>
293            /// <param name="delay">遅延時間(ミリ秒)</param>
294            /// <returns>キーが押された場合はそのキーコードを,キーが押されないまま指定されたタイムアウト時間が過ぎてしまった場合は -1</returns>
295            static public int WaitKey(Int32 delay)
296            {
297                    return CvDll.cvWaitKey(delay);
298            }
299
300        /// <summary>
301            /// 引数に指定した画像をそれぞれ別のウィンドウで表示し、キー入力待ち状態にする。
302            /// </summary>
303            /// <param name="images">表示させる画像。任意の個数を指定できる。</param>
304            static public void ShowImages( params CvArr[] images )
305            {
306            if (images == null)
307            {
308                throw new ArgumentNullException("images");
309            }
310                    List<CvWindow> windows = new List<CvWindow>();
311                    foreach(CvArr img in images){
312                            windows.Add( new CvWindow(img) );
313                    }
314                    WaitKey();
315                    foreach(CvWindow w in windows){
316                            w.Close();
317                    }
318            }
319        #endregion
320    }
321}
Note: See TracBrowser for help on using the browser.