C# 大華相機采集類


  1  class Camera // 大華相機類
  2     {
  3         private IDevice m_dev; /* 設備對象 */
  4         List<IGrabbedRawData> m_frameList = new List<IGrabbedRawData>();  /* 圖像緩存列表 */
  5         Thread renderThread = null;         /* 顯示線程  */
  6         bool m_bShowLoop = true;            /* 線程控制變量 */
  7         Mutex m_mutex = new Mutex();        /* 鎖,保證多線程安全 */
  8         // public event Action<HObject> NewImage;  // 圖像顯示事件
  9 
 10         public Camera()
 11         {
 12             if (null == renderThread)
 13             {
 14                 renderThread = new Thread(new ThreadStart(ShowThread));
 15                 renderThread.IsBackground = true;
 16                 renderThread.Start();
 17             }
 18             m_stopWatch.Start();//時間計時開始
 19         }
 20 
 21         /* 轉碼顯示線程 */
 22         private void ShowThread()
 23         {
 24             while (m_bShowLoop)//線程控制變量為True
 25             {
 26                 if (m_frameList.Count == 0) //圖像緩存列表
 27                 {
 28                     Thread.Sleep(10);
 29                     continue;
 30                 }
 31 
 32                 /* 圖像隊列取最新幀 */
 33                 m_mutex.WaitOne();//阻止當前線程,直到當前收到信號
 34                 IGrabbedRawData frame = m_frameList.ElementAt(0);//返回隊列中指定索引處的元素
 35                 m_frameList.RemoveAt(0);
 36                 m_frameList.Clear();
 37                 m_mutex.ReleaseMutex();
 38 
 39                 /* 主動調用回收垃圾 */
 40                 GC.Collect();
 41 
 42                 /* 控制顯示最高幀率為25FPS */
 43                 if (false == isTimeToDisplay())
 44                 {
 45                     continue;
 46                 }
 47 
 48                 try
 49                 {
 50                     /* 圖像轉碼成bitmap圖像 */
 51                     var bitmap = frame.ToBitmap(false);
 52                     
 53                     // 在這里使用采集的圖像
 54                     //if (NewImage != null)
 55                     //{
 56                     //    NewImage(image);
 57                     //}
 58                 }
 59                 catch
 60                 {
 61                     
 62                 }
 63             }
 64         }
 65 
 66         const int DEFAULT_INTERVAL = 40;//默認的時間間隔
 67         Stopwatch m_stopWatch = new Stopwatch();    /* 時間統計器 */
 68 
 69         /* 判斷是否應該做顯示操作 */
 70         private bool isTimeToDisplay()
 71         {
 72             m_stopWatch.Stop();
 73             long m_lDisplayInterval = m_stopWatch.ElapsedMilliseconds;//獲取實例測量出的總時間
 74             if (m_lDisplayInterval <= DEFAULT_INTERVAL)
 75             {
 76                 m_stopWatch.Start();
 77                 return false;
 78             }
 79             else
 80             {
 81                 m_stopWatch.Reset();
 82                 m_stopWatch.Start();
 83                 return true;
 84             }
 85         }
 86  
 87         /* 相機打開回調 */
 88         private void OnCameraOpen(object sender, EventArgs e)
 89         {
 90             // 在這里記錄相機已打開
 91         }
 92 
 93         /* 相機關閉回調 */
 94         private void OnCameraClose(object sender, EventArgs e)
 95         {
 96             // 在這里記錄相機已關閉
 97         }
 98 
 99         /* 相機丟失回調 */
100         private void OnConnectLoss(object sender, EventArgs e)
101         {
102             m_dev.ShutdownGrab();
103             m_dev.Dispose();
104             m_dev = null;
105         }
106 
107         /* 碼流數據回調 */
108         private void OnImageGrabbed(Object sender, GrabbedEventArgs e)
109         {
110             m_mutex.WaitOne();//    m_mutex鎖,保證多線程安全
111             m_frameList.Add(e.GrabResult.Clone());/* 圖像緩存列表 */
112             m_mutex.ReleaseMutex();
113         }
114 
115         /// <summary>
116         /// 打開相機
117         /// </summary>
118         /// <returns>返回字符串為空表示打開成功,不為空表示打開失敗,字符串內容為異常信息</returns> 
119         /// <param name="triggerSource">觸發源選擇 軟觸發或外觸發</param>
120         /// <returns></returns>
121         public string Open(string triggerSource)
122         {
123             string sRet = string.Empty;
124             try
125             {
126                 /* 設備搜索 */
127                 List<IDeviceInfo> li = Enumerator.EnumerateDevices();
128                 if (li.Count > 0)
129                 {
130                     /* 獲取搜索到的第一個設備 */
131                     m_dev = Enumerator.GetDeviceByIndex(0);
132 
133                     /* 注冊鏈接事件 */
134                     m_dev.CameraOpened += OnCameraOpen;
135                     m_dev.ConnectionLost += OnConnectLoss;
136                     m_dev.CameraClosed += OnCameraClose;
137 
138                     /* 打開設備 */
139                     if (!m_dev.Open())
140                         sRet = "打開相機失敗";
141 
142                     /* 設置TriggerSource 軟觸發還是外觸發*/
143                     m_dev.TriggerSet.Open(triggerSource);
144                    
145                     /* 設置圖像格式 */
146                     using (IEnumParameter p = m_dev.ParameterCollection[ParametrizeNameSet.ImagePixelFormat])
147                     {
148                         p.SetValue("Mono8");
149                     }
150         
151                     /* 設置緩存個數為8(默認值為16) */
152                     m_dev.StreamGrabber.SetBufferCount(8);
153 
154                     /* 注冊碼流回調事件 */
155                     m_dev.StreamGrabber.ImageGrabbed += OnImageGrabbed;
156 
157                     /* 開啟碼流 */
158                     if (!m_dev.GrabUsingGrabLoopThread())
159                         sRet = "開啟碼流失敗";
160                 }
161                 else
162                 {
163                     sRet = "未找到相機設備";
164                 }
165             }
166             catch (Exception e)
167             {
168                 sRet = e.Message;
169             }
170             return sRet;
171         }
172 
173         /// <summary>
174         /// 關閉相機
175         /// </summary>
176         /// <returns>返回字符串為空表示關閉成功,不為空表示關閉失敗,字符串內容為異常信息</returns>
177         public string Close()
178         {
179             string sRet = String.Empty;
180             try
181             {
182                 if (m_dev == null)
183                 {
184                     sRet = "Device is invalid";
185                 }
186 
187                 m_dev.StreamGrabber.ImageGrabbed -= OnImageGrabbed;         /* 反注冊回調 */
188                 m_dev.ShutdownGrab();                                       /* 停止碼流 */
189                 m_dev.Close();                                              /* 關閉相機 */
190             }
191             catch (Exception e)
192             {
193                 sRet = e.Message;
194             }
195             return sRet;
196         }
197 
198         /* 窗口關閉 */
199         public void OnClosed(EventArgs e)
200         {
201             if (m_dev != null)
202             {
203                 m_dev.Dispose();
204                 m_dev = null;
205             }
206 
207             m_bShowLoop = false;
208             renderThread.Join();
209         }
210         /// <summary>
211         /// 設置觸發模式 軟觸發下設置On后自由拉流(連續觸發)Off(單次觸發)
212         /// </summary>
213         /// <param name="value"></param>
214         public string SetTriggerMode(string value="On")
215         {
216             if (m_dev == null)
217             {
218                 return "Device is invalid";
219             }
220             if (!m_dev.IsOpen)
221             {
222                 return "相機未打開";
223             }
224             using (IEnumParameter p = m_dev.ParameterCollection[ParametrizeNameSet.TriggerMode])
225             {
226                 p.SetValue(value);
227             }
228             return "";
229         }
230         /// <summary>
231         /// 設置曝光
232         /// </summary>
233         /// <param name="value"></param>
234         public string SetExposureTime(float value)
235         {
236             if (m_dev == null)
237             {
238                 return "Device is invalid";
239             }
240             if (!m_dev.IsOpen)
241             {
242                 return "相機未打開";
243             }
244             double min = GetMinExposureTime();
245             double max = GetMaxExposureTime();
246             if (value < min || value > max)
247             {
248                 return string.Format("參數值不在范圍內,min:{0},max:{1}", min, max);
249             }
250             using (IFloatParameter p = m_dev.ParameterCollection[ParametrizeNameSet.ExposureTime])
251             {
252                 p.SetValue(value);
253             }
254             return "";
255         }
256         /// <summary>
257         /// 設置增益
258         /// </summary>
259         /// <param name="value"></param>
260         public string SetGainRaw(float value)
261         {
262             if (m_dev == null)
263             {
264                 return "Device is invalid";
265             }
266             if (!m_dev.IsOpen)
267             {
268                 return "相機未打開";
269             }
270             double min = GetMinGainRaw();
271             double max = GetMaxGainRaw();
272             if (value < min || value > max)
273             {
274                 return string.Format("參數值不在范圍內,min:{0},max:{1}", min, max);
275             }
276             using (IFloatParameter p = m_dev.ParameterCollection[ParametrizeNameSet.GainRaw])
277             {
278                 p.SetValue(value);
279             }
280             return "";
281         }
282         /// <summary>
283         /// 設置圖像的寬度
284         /// </summary>
285         /// <param name="value"></param>
286         /// <returns></returns>
287         public string SetImageWidth(int value)
288         {
289             if (m_dev == null)
290             {
291                 return "Device is invalid";
292             }
293             if (!m_dev.IsOpen)
294             {
295                 return "相機未打開";
296             }
297             double min = GetMinImageWidth();
298             double max = GetMaxImageWidth();
299             if (value < min || value > max)
300             {
301                 return string.Format("參數值不在范圍內,min:{0},max:{1}", min, max);
302             }
303             using (IIntegraParameter p = m_dev.ParameterCollection[ParametrizeNameSet.ImageWidth])
304             {
305                 p.SetValue(value);
306             }
307             return "";
308         }
309         /// <summary>
310         /// 設置圖像的寬度
311         /// </summary>
312         /// <param name="value"></param>
313         /// <returns></returns>
314         public string SetImageHeight(int value)
315         {
316             if (m_dev == null)
317             {
318                 return "Device is invalid";
319             }
320             if (!m_dev.IsOpen)
321             {
322                 return "相機未打開";
323             }
324             double min = GetMinImageHeight();
325             double max = GetMaxImageHeight();
326             if (value < min || value > max)
327             {
328                 return string.Format("參數值不在范圍內,min:{0},max:{1}", min, max);
329             }
330             using (IIntegraParameter p = m_dev.ParameterCollection[ParametrizeNameSet.ImageHeight])
331             {
332                 p.SetValue(value);
333             }
334             return "";
335         }
336         /// <summary>
337         /// 設置圖像偏移X
338         /// </summary>
339         /// <param name="value"></param>
340         /// <returns></returns>
341         public string SetImageOffsetX(int value)
342         {
343             if (m_dev == null)
344             {
345                 return "Device is invalid";
346             }
347             if (!m_dev.IsOpen)
348             {
349                 return "相機未打開";
350             }
351             double min = GetMinImageOffsetX();
352             double max = GetMaxImageOffsetX();
353             if (value < min || value > max)
354             {
355                 return string.Format("參數值不在范圍內,min:{0},max:{1}", min, max);
356             }
357             using (IIntegraParameter p = m_dev.ParameterCollection[ParametrizeNameSet.ImageOffsetX])
358             {
359                 p.SetValue(value);
360             }
361             return "";
362         }
363         /// <summary>
364         /// 設置圖像偏移Y
365         /// </summary>
366         /// <param name="value"></param>
367         /// <returns></returns>
368         public string SetImageOffsetY(int value)
369         {
370             if (m_dev == null)
371             {
372                 return "Device is invalid";
373             }
374             if (!m_dev.IsOpen)
375             {
376                 return "相機未打開";
377             }
378             double min = GetMinImageOffsetY();
379             double max = GetMaxImageOffsetY();
380             if (value < min || value > max)
381             {
382                 return string.Format("參數值不在范圍內,min:{0},max:{1}", min, max);
383             }
384             using (IIntegraParameter p = m_dev.ParameterCollection[ParametrizeNameSet.ImageOffsetY])
385             {
386                 p.SetValue(value);
387             }
388             return "";
389         }
390 
391         #region 獲取相機參數的取值范圍
392         public double GetMinExposureTime()
393         {
394             using (IFloatParameter p = m_dev.ParameterCollection[ParametrizeNameSet.ExposureTime])
395             {
396                 return p.GetMinimum();
397             }
398         }
399         public double GetMaxExposureTime()
400         {
401             using (IFloatParameter p = m_dev.ParameterCollection[ParametrizeNameSet.ExposureTime])
402             {
403                 return p.GetMaximum();
404             }
405         }
406         public double GetMinGainRaw()
407         {
408             using (IFloatParameter p = m_dev.ParameterCollection[ParametrizeNameSet.GainRaw])
409             {
410                 return p.GetMinimum();
411             }
412         }
413         public double GetMaxGainRaw()
414         {
415             using (IFloatParameter p = m_dev.ParameterCollection[ParametrizeNameSet.GainRaw])
416             {
417                 return p.GetMaximum();
418             }
419         }
420         public long GetMinImageWidth()
421         {
422             using (IIntegraParameter p = m_dev.ParameterCollection[ParametrizeNameSet.ImageWidth])
423             {
424                 return p.GetMinimum();
425             }
426         }
427         public long GetMaxImageWidth()
428         {
429             using (IIntegraParameter p = m_dev.ParameterCollection[ParametrizeNameSet.ImageWidth])
430             {
431                 return p.GetMaximum();
432             }
433         }
434         public long GetMinImageHeight()
435         {
436             using (IIntegraParameter p = m_dev.ParameterCollection[ParametrizeNameSet.ImageHeight])
437             {
438                 return p.GetMinimum();
439             }
440         }
441         public long GetMaxImageHeight()
442         {
443             using (IIntegraParameter p = m_dev.ParameterCollection[ParametrizeNameSet.ImageHeight])
444             {
445                 return p.GetMaximum();
446             }
447         }
448         public long GetMinImageOffsetX()
449         {
450             using (IIntegraParameter p = m_dev.ParameterCollection[ParametrizeNameSet.ImageOffsetX])
451             {
452                 return p.GetMinimum();
453             }
454         }
455         public long GetMaxImageOffsetX()
456         {
457             using (IIntegraParameter p = m_dev.ParameterCollection[ParametrizeNameSet.ImageOffsetX])
458             {
459                 return p.GetMaximum();
460             }
461         }
462         public long GetMinImageOffsetY()
463         {
464             using (IIntegraParameter p = m_dev.ParameterCollection[ParametrizeNameSet.ImageOffsetY])
465             {
466                 return p.GetMinimum();
467             }
468         }
469         public long GetMaxImageOffsetY()
470         {
471             using (IIntegraParameter p = m_dev.ParameterCollection[ParametrizeNameSet.ImageOffsetY])
472             {
473                 return p.GetMaximum();
474             }
475         }
476         #endregion
477 
478         /// <summary>
479         /// bitmap圖像轉HObject
480         /// </summary>
481         /// <param name="bmp"></param>
482         /// <returns></returns>
483         //private HObject Bitmap2HObjectBpp24(Bitmap bmp)
484         //{
485         //    HObject Hobj;
486         //    HOperatorSet.GenEmptyObj(out Hobj);
487         //    try
488         //    {
489         //        Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
490 
491         //        BitmapData srcBmpData = bmp.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
492         //        HOperatorSet.GenImageInterleaved(out Hobj, srcBmpData.Scan0, "bgr", bmp.Width, bmp.Height, 0, "byte", 0, 0, 0, 0, -1, 0);
493         //        bmp.UnlockBits(srcBmpData);
494         //    }
495         //    catch (Exception e)
496         //    {
497 
498         //    }
499         //    return Hobj;
500         //}
501     }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM