博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# 大华相机图像采集
阅读量:5134 次
发布时间:2019-06-13

本文共 5802 字,大约阅读时间需要 19 分钟。

using System;using System.Collections.Generic;using System.Drawing;using System.Linq;using System.Threading;using System.Windows.Forms;using ThridLibray;namespace _1_5相机SDK图像采集{    public class Camera    {        List
m_frameList = new List
(); /* 图像缓存列表 */ Thread renderThread = null; /* 显示线程 */ bool m_bShowLoop = true; /* 线程控制变量 */ Mutex m_mutex = new Mutex(); /* 锁,保证多线程安全 */ public event Action
NewImage; public Camera() { if (null == renderThread) { renderThread = new Thread(new ThreadStart(ShowThread)); renderThread.IsBackground = true; renderThread.Start(); } } /* 转码显示线程 */ private void ShowThread() { while (m_bShowLoop) { if (m_frameList.Count == 0) { Thread.Sleep(1); continue; } /* 图像队列取最新帧 */ m_mutex.WaitOne(); IGrabbedRawData frame = m_frameList.ElementAt(0); m_frameList.RemoveAt(0); m_frameList.Clear(); m_mutex.ReleaseMutex(); /* 主动调用回收垃圾 */ GC.Collect(); try { /* 图像转码成bitmap图像 */ var bitmap = frame.ToBitmap(false); if (NewImage!=null) { NewImage(bitmap); } } catch (Exception exception) { Catcher.Show(exception); } } } /* 设备对象 */ private IDevice m_dev; /* 相机打开回调 */ private void OnCameraOpen(object sender, EventArgs e) { MessageBox.Show("相机已打开!"); } /* 相机关闭回调 */ private void OnCameraClose(object sender, EventArgs e) { MessageBox.Show("相机已关闭!"); } /* 相机丢失回调 */ private void OnConnectLoss(object sender, EventArgs e) { m_dev.ShutdownGrab(); m_dev.Dispose(); m_dev = null; } public void btnOpen() { try { /* 设备搜索 */ List
li = Enumerator.EnumerateDevices(); if (li.Count > 0) { /* 获取搜索到的第一个设备 */ m_dev = Enumerator.GetDeviceByIndex(0); /* 注册链接事件 */ m_dev.CameraOpened += OnCameraOpen; m_dev.CameraClosed += OnCameraClose; /* 打开设备 */ if (!m_dev.Open()) { MessageBox.Show(@"连接相机失败"); return; } /* 打开Software Trigger */ m_dev.TriggerSet.Open(TriggerSourceEnum.Software); /* 设置图像格式 */ using (IEnumParameter p = m_dev.ParameterCollection[ParametrizeNameSet.ImagePixelFormat]) { p.SetValue("Mono8"); } /* 设置曝光 */ using (IFloatParameter p = m_dev.ParameterCollection[ParametrizeNameSet.ExposureTime]) { p.SetValue(1000); } /* 设置增益 */ using (IFloatParameter p = m_dev.ParameterCollection[ParametrizeNameSet.GainRaw]) { p.SetValue(1.0); } /* 设置缓存个数为8(默认值为16) */ m_dev.StreamGrabber.SetBufferCount(8); /* 注册码流回调事件 */ m_dev.StreamGrabber.ImageGrabbed += OnImageGrabbed; /* 开启码流 */ if (!m_dev.GrabUsingGrabLoopThread()) { MessageBox.Show(@"开启码流失败"); return; } } } catch (Exception exception) { Catcher.Show(exception); } } /* 码流数据回调 */ private void OnImageGrabbed(Object sender, GrabbedEventArgs e) { m_mutex.WaitOne(); m_frameList.Add(e.GrabResult.Clone()); m_mutex.ReleaseMutex(); } /* 停止码流 */ public void btnClose() { try { if (m_dev == null) { throw new InvalidOperationException("Device is invalid"); } m_dev.StreamGrabber.ImageGrabbed -= OnImageGrabbed; /* 反注册回调 */ m_dev.ShutdownGrab(); /* 停止码流 */ m_dev.Close(); /* 关闭相机 */ } catch (Exception exception) { Catcher.Show(exception); } } /* 窗口关闭 */ public void OnClosed(EventArgs e) { if (m_dev != null) { m_dev.Dispose(); m_dev = null; } m_bShowLoop = false; renderThread.Join(); } /* 执行软触发 */ public void SoftwareTrigger() { if (m_dev == null) { throw new InvalidOperationException("Device is invalid"); } try { m_dev.ExecuteSoftwareTrigger(); } catch (Exception exception) { Catcher.Show(exception); } } }}

 

转载于:https://www.cnblogs.com/BKYZFSN/p/11027417.html

你可能感兴趣的文章
PE知识复习之PE的导入表
查看>>
POJ 3280 Cheapest Palindrome
查看>>
HDU 2076 夹角有多大(题目已修改,注意读题)
查看>>
Objective-C非正式协议与正式协议
查看>>
Windows核心编程学习九:利用内核对象进行线程同步
查看>>
[置顶] Oracle学习经验谈
查看>>
buildconfiguration[C/C++]_[从netbeans里提取的通用构建C++项目的Makefile文件]
查看>>
mysql常见操作
查看>>
如何解决inline-block元素的空白间距
查看>>
ethtool 命令输出的注意点--网卡参数
查看>>
24小时学通LINUX内核系列
查看>>
linux进程调度之 FIFO 和 RR 调度策略---SYSTEMTAP
查看>>
visualvm
查看>>
科学计算库学习总结
查看>>
win 10 无法删除系统文件的解决方法(提示:无法枚举容器中的对象 访问被拒绝)...
查看>>
使用 Azure Site Recovery 将内部部署虚拟化工作负荷迁移至 Azure
查看>>
[Err] 1093 - You can't specify target table 's' for update in FROM clause
查看>>
Qt入门(1)——初识Qt
查看>>
VC++实现全局钩子勾住消息对话框
查看>>
VC++2012编程演练数据结构《25》线索二叉树
查看>>