简介

Allied Vision相机图像采集处理。Vimba是Allied Vision推出的极具前瞻性的独立软件开发工具包(SDK),适于所有配备GigE Vision、USB3 Vision、IEEE 1394和Camera Link接口的Allied Vision相机。通过Vimba,您可以轻松控制Allied Vision相机、即刻获取图像,并为复杂的视觉应用独立编程或连接第三方资源库。安装包链接:https://download.csdn.net/download/c_gyl/10854105。安装软件后,在工程中添加引用VimbaNET.dll。代码下载:https://download.csdn.net/download/c_gyl/10854122

使用

可根据需要,自行裁剪。

1.变量

        public event Action<Bitmap> ImageGrabbed;private Bitmap SingleBitmap;private bool IsSingleGrab;public bool IsLive;public bool IsConnect;private VimbaHelper m_VimbaHelper;private VimbaHelper.FrameInfos ShowFrameInfos = VimbaHelper.FrameInfos.Off; //Show frame info'sprivate string CameraID = null; //The camera ID

2.打开

启动后,查找已连接的相机

        public bool Open(){bool result = true;try{m_VimbaHelper = new VimbaHelper();m_VimbaHelper.Startup(); // Startup APIif (null == CameraID){// Open first available camera// Fetch all cameras known to VimbaList<Camera> cameras = m_VimbaHelper.CameraList;if (cameras.Count < 0){ result = false;}foreach (Camera currentCamera in cameras){// Check if we can open the camera in full modeVmbAccessModeType accessMode = currentCamera.PermittedAccess;if (VmbAccessModeType.VmbAccessModeFull == (VmbAccessModeType.VmbAccessModeFull & accessMode)){// Now get the camera IDCameraID = currentCamera.Id;break;}}result = (null == CameraID ? false:true);}}catch (Exception ex){string err = ex.Message;result = false;}finally{IsConnect = result;}return result;}

2.连续采集

启动采集后,绑定采集事件

        public void ContinousGrab(){try{if (!IsConnect){return;}m_VimbaHelper.StartContinuousImageAcquisition(CameraID, ShowFrameInfos);m_VimbaHelper.m_Camera.OnFrameReceived += this.GetImage;this.IsLive = true;}catch (Exception ex){string err = ex.Message;}}

3. 获取图像

绑定ImageGrabbed,即可取出图像或通过frame.Fill取出图像后自行处理。

        private void GetImage(Frame frame){try{if (!IsConnect || !IsLive){return;}Bitmap bitMap = null;frame.Fill(ref bitMap);if (ImageGrabbed != null){ImageGrabbed(bitMap);}if (IsSingleGrab){this.SingleBitmap = new Bitmap(bitMap);IsSingleGrab = false;}}catch (Exception ex){string err = ex.Message;}}

4.取出单个图像

在不停止采集的情况下,取出单个图像。超时部分可根据实际更改。

        public bool SingleGrab(out Bitmap bitmap){bitmap = null;try{if (!IsConnect){return false;}IsSingleGrab = true;int count = 0;while (IsSingleGrab){count++;Thread.Sleep(10);if (count > 100){return false;}}bitmap = new Bitmap(SingleBitmap);}catch (Exception ex){string err = ex.Message;return false;}return bitmap != null ? true : false;}

5 停止采集

当停止采集图像时使用。

        public void StopGrab(){try{if (!IsConnect){return;}m_VimbaHelper.m_Camera.OnFrameReceived -= this.GetImage;m_VimbaHelper.StopContinuousImageAcquisition();this.IsLive = false;}catch (Exception ex){string err = ex.Message;}}

4. 关闭

软件或者资源释放时使用。

        public void Close(){try{if (!IsConnect){return;}CameraID = null;IsConnect = false;IsLive = false;}catch (Exception ex){string err = ex.Message;}finally{try{if (m_VimbaHelper != null){m_VimbaHelper.Shutdown();m_VimbaHelper = null;}}catch (Exception ex){string err = ex.Message;} }}

采集类

AsynchronousGrabConsole类

/*=============================================================================Copyright (C) 2012 - 2016 Allied Vision Technologies.  All Rights Reserved.Redistribution of this file, in original or modified form, withoutprior written consent of Allied Vision Technologies is prohibited.-------------------------------------------------------------------------------File:        VimbaHelper.csDescription: Implementation file for the VimbaHelper class that demonstrateshow to implement an asynchronous, continuous image acquisitionwith VimbaNET.-------------------------------------------------------------------------------THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIEDWARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF TITLE,NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR  PURPOSE AREDISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSEDAND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, ORTORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USEOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.=============================================================================*/namespace AsynchronousGrabConsole
{using System;using System.Collections.Generic;using AVT.VmbAPINET;public delegate void FrameReceivedHandler(Frame frame);/// <summary>/// A helper class as a wrapper around Vimba/// </summary>public class VimbaHelper{private Vimba m_Vimba = null;                           // Main Vimba API entry objectpublic Camera m_Camera = null;                         // Camera object if camera is openprivate bool m_Acquiring = false;                       // Flag to remember if acquisition is runningprivate FrameInfos m_ShowFrameInfo = FrameInfos.Off;    // Indicates if frame info is shown in the consoleprivate int systemTime = System.Environment.TickCount;  // Hold the system time to calculate the frame rateprivate ulong m_FrameID = 0;public event FrameReceivedHandler m_FrameReceivedHandler = null;/// <summary>/// Initializes a new instance of the VimbaHelper class/// </summary>public VimbaHelper(){}/// <summary>/// Finalizes an instance of the VimbaHelper class and shuts down Vimba/// </summary>~VimbaHelper(){// Release Vimba API if user forgot to call ShutdownReleaseVimba();}/// <summary>/// Frame Infos Enumeration/// </summary>public enum FrameInfos{/// <summary>/// Do not Show frame information/// </summary>Off = 0,/// <summary>/// Show Frame information/// </summary>Show,/// <summary>/// Show frame information, if a frame is lost or a frame is not complete/// </summary>Automatic}/// <summary>/// Gets the current camera list/// </summary>public List<Camera> CameraList{get{// Check if API has been started up at allif (null == m_Vimba){throw new Exception("Vimba is not started.");}List<Camera> cameraList = new List<Camera>();CameraCollection cameras = m_Vimba.Cameras;foreach (Camera camera in cameras){cameraList.Add(camera);}return cameraList;}}/// <summary>/// Starts up Vimba API and loads all transport layers/// </summary>public void Startup(){// Instantiate main Vimba objectVimba vimba = new Vimba();// Start up Vimba APIvimba.Startup();m_Vimba = vimba;}/// <summary>/// Shuts down Vimba API/// </summary>public void Shutdown(){// Check if API has been started up at allif (null == m_Vimba){throw new Exception("Vimba has not been started.");}ReleaseVimba();}/// <summary>/// Returns the version of Vimba API/// </summary>/// <returns></returns>public String GetVersion(){if (null == m_Vimba){throw new Exception("Vimba has not been started.");}VmbVersionInfo_t version_info = m_Vimba.Version;return String.Format("{0:D}.{1:D}.{2:D}", version_info.major, version_info.minor, version_info.patch);}/// <summary>/// Starts the continuous image acquisition and opens the camera/// Registers the event handler for the new frame event/// </summary>/// <param name="id">The camera ID</param>/// <param name="showCameraInfo">Flag to indicate if the Camera info data shall be shown or not</param>public void StartContinuousImageAcquisition(string id, FrameInfos showCameraInfo){// Check parametersif (null == id){throw new ArgumentNullException("id");}// Check if API has been started up at allif (null == m_Vimba){throw new Exception("Vimba is not started.");}// Check if a camera is already openif (null != m_Camera){throw new Exception("A camera is already open.");}// show camera info's in the console Output :m_ShowFrameInfo = showCameraInfo;// Open cameram_Camera = m_Vimba.OpenCameraByID(id, VmbAccessModeType.VmbAccessModeFull);if (null == m_Camera){throw new NullReferenceException("No camera retrieved.");}// Set the GeV packet size to the highest possible value// (In this example we do not test whether this cam actually is a GigE cam)try{m_Camera.Features["GVSPAdjustPacketSize"].RunCommand();while (false == m_Camera.Features["GVSPAdjustPacketSize"].IsCommandDone()){// Do nothing}}catch{// Do nothing}bool error = true;try{// Register frame callbackm_Camera.OnFrameReceived += this.OnFrameReceived;// Reset member variablesm_Acquiring = true;// Start synchronous image acquisition (grab)m_Camera.StartContinuousImageAcquisition(3);error = false;}finally{// Close camera already if there was an errorif (true == error){ReleaseCamera();}}}/// <summary>/// Stops the image acquisition/// </summary>public void StopContinuousImageAcquisition(){// Check if API has been started up at allif (null == m_Vimba){throw new Exception("Vimba is not started.");}// Check if no camera is openif (null == m_Camera){throw new Exception("No camera open.");}// Close cameraReleaseCamera();}/// <summary>/// Display the image as dots or show the FrameInfo/// </summary>/// <param name="frame">The received frame</param>public void OutPutFrameInfo(Frame frame){bool showFrameInfo = false;double frameRate = 0;string status = string.Empty;if (null == frame){throw new ArgumentNullException("frame");}frameRate = CalcFPS(); // Get frame ratestatus = GetFrameStatus(frame); // Get frame statusulong nFramesMissing = GetFramesMissing(frame);if (0 < nFramesMissing){if (1 == nFramesMissing){Console.WriteLine("1 missing frame detected\n");}else{Console.WriteLine("{0} missing frames detected\n", nFramesMissing);}}showFrameInfo = status != "Complete" || 0 < nFramesMissing;  // Show frame infos for incomplete frame or if a frame is lostif (m_ShowFrameInfo == FrameInfos.Show || (showFrameInfo && m_ShowFrameInfo == FrameInfos.Automatic)){if (m_ShowFrameInfo == FrameInfos.Automatic)Console.WriteLine(string.Empty); Console.Write("FrameID:");Console.Write(frame.FrameID);Console.Write(" Status:");Console.Write(status);Console.Write(" Size:");Console.Write(frame.Width);Console.Write("x");Console.Write(frame.Height);Console.Write(" Format:");Console.Write(frame.PixelFormat);Console.Write(" FPS:");if (!double.IsNaN(frameRate) && !double.IsInfinity(frameRate) && nFramesMissing <= 0){Console.WriteLine(frameRate.ToString("0.0"));}else{Console.WriteLine("?");}}else{Console.Write(".");}}/// <summary>/// Checks if a frame is missing/// </summary>/// <param name="frame">The received frame</param>/// <returns>True if a frame is missing</returns>private ulong GetFramesMissing(Frame frame){ulong missingFrames;// For USB the very first frame ID is 0if (frame.FrameID == 0 && m_FrameID == 0) {missingFrames = 0;}else if (frame.FrameID - m_FrameID == 1){missingFrames = 0;}else{missingFrames = frame.FrameID - m_FrameID;}m_FrameID = frame.FrameID;return missingFrames;}/// <summary>/// Calculates the Frame rate/// </summary>/// <returns>The frame rate</returns>private double CalcFPS(){int sytemTimeLocal = System.Environment.TickCount;double fps = 1000 / (double)(sytemTimeLocal - systemTime);systemTime = sytemTimeLocal;return fps;}/// <summary>/// Gets the frame Status as a string/// </summary>/// <param name="frame">The received frame</param>/// <returns>Frame Status string</returns>private string GetFrameStatus(Frame frame){string status = string.Empty;switch (frame.ReceiveStatus){case VmbFrameStatusType.VmbFrameStatusComplete:status = "Complete";break;case VmbFrameStatusType.VmbFrameStatusIncomplete:status = "Incomplete";break;case VmbFrameStatusType.VmbFrameStatusTooSmall:status = "Too small";break;case VmbFrameStatusType.VmbFrameStatusInvalid:status = "Invalid";break;default:status = "?";break;}return status;}/// <summary>/// Handles the frame received event/// The frame is displayed and eventually queued/// </summary>/// <param name="frame">The received frame</param>private void OnFrameReceived(Frame frame){try{// Convert frame into displayable imageOutPutFrameInfo(frame);}finally{// We make sure to always return the frame to the APItry{m_Camera.QueueFrame(frame);}catch{// Do nothing}}}/// <summary>///  Unregisters the new frame event///  Stops the capture engine///  Closes the camera/// </summary>private void ReleaseCamera(){if (null != m_Camera){// We can use cascaded try-finally blocks to release the// camera step by step to make sure that every step is executed.try{try{try{m_Camera.OnFrameReceived -= this.OnFrameReceived;if (true == m_Acquiring){m_Camera.StopContinuousImageAcquisition();}}catch(Exception ex){string err = ex.Message;}}finally{m_Acquiring = false;m_Camera.Close();}}finally{m_Camera = null;}}}/// <summary>///  Releases the camera///  Shuts down Vimba/// </summary>private void ReleaseVimba(){if (null != m_Vimba){// We can use cascaded try-finally blocks to release the// Vimba API step by step to make sure that every step is executed.try{try{// First we release the camera (if there is one)ReleaseCamera();// Now finally shutdown the APIm_Vimba.Shutdown();}catch(Exception ex){string err = ex.Message;}}finally{m_Vimba = null;}}}}
}

Allied Vision相机相关推荐

  1. Nvidia Tx2平台 Allied vision相机驱动调试记录

    1. 前言 之前调试了一个allied vision alvium相机 通过CSI2连接到板 想用OpenCV写一个简单的c++代码 cv::VideoCapture capvid ; cv::Mat ...

  2. 基于FPGA的GigE Vision相机图像采集方案设计

    1 概述 GigE Vision是一个比较复杂的协议,要在FPGA中完全实现具有较大的难度.如果FPGA作为接收端希望实现GigE Vision相机的配置和图像采集功能,则只需要实现其中小部分功能即可 ...

  3. FPGA的GigE Vision IP相机图像采集方案设计,转换为千兆UDP,支持10G MAC

    1 概述 GigE Vision是一个比较复杂的协议,要在FPGA中完全实现具有较大的难度.如果FPGA作为接收端希望实现GigE Vision相机的配置和图像采集功能,则只需要实现其中小部分功能即可 ...

  4. 2021年全球GigE相机收入大约721.2百万美元,预计2028年达到1293.9百万美元

    本文研究全球市场.主要地区和主要国家GigE相机的销量.销售收入等,同时也重点分析全球范围内主要厂商(品牌)竞争态势,GigE相机销量.价格.收入和市场份额等. 针对过去五年(2017-2021)年的 ...

  5. 2022年全球与中国偏光成像相机市场现状及未来发展趋势

    2022-2028全球与中国偏光成像相机市场现状及未来发展趋势 根据QYR(恒州博智)的统计及预测,2021年全球偏光成像相机市场销售额达到了 亿美元,预计2028年将达到 亿美元,年复合增长率(CA ...

  6. python怎么调用gige相机_带有OpenCV / python的Prosilica GigE摄像机

    我在Mac OS X上使用GigE(以太网)prosilica GC摄像机,并且能够通过Allied Vision的专有样本查看软件将其读出. 我希望能够使用OpenCV读出相机.我已经正确安装了op ...

  7. AVT工业相机Windows、Opencv开发——相机的配置

    引子 接口问题,一直是两者相连.数据相通的一个难点.本文采用的是德国Allied vision工业相机,与其他使用的USB接口的相机不同,该工业相机的接口类型为GigE.因此,要使工业相机和软件连接成 ...

  8. DALSA线阵CCD相机开发 之 opencv读取图片

    SDK的下载 Sapera_LT_8.31_SDK 百度网盘下载地址:链接:密码:ckm7. SDK的安装 解压运行.exe文件,按照提示确定,下一步即可. 帮助文档和demo 如果要获得完整的帮助文 ...

  9. 【转】GigE Vision简介

    转自:GigE Vision简介_计算机视觉小菜鸟的专栏-CSDN博客_gige vision GigE Vision是由AIA制定的通信协议,用来实现在机器视觉领域利用千兆以太网接口进行图像的高速传 ...

  10. 太强了!机器视觉相机解决硬币制造难题!

    尽管目前数字化支付手段已非常普及,但对于杂货店.书报亭.售票机和停车记时器等而言,硬币仍然是一种可靠的备用支付方式.数十亿的硬币正在市场上流通,每个硬币均需完全相同.每一种硬币必须呈现一模一样的头部和 ...

最新文章

  1. jQuery绑定事件的三种常见方式(bind、one、【change、click、keydown、hover】)
  2. GUI编程之tkinter
  3. VMware Ubuntu NAT上网方式配置
  4. 全国大学生电子设计大赛 赛前准备
  5. BZOJ 1951: [Sdoi2010]古代猪文 [Lucas定理 中国剩余定理]
  6. html iframe post,使用Jquery和IFrame的跨子域请求(GET,POST,…)
  7. MySQL的主动优化和被动优化_MySQL“被动”性能优化汇总!
  8. 2019.3.23 捕获异常
  9. python gc清理无用变量与内存
  10. 红黑树的删除_红黑树揭秘
  11. 一级计算机技术,《一级考试大参考》自动化技术、计算机技术.pdf
  12. 摄影获得最佳图像的十大要诀_十大最佳应用程序性能管理工具
  13. 页面加载完就执行的设置?
  14. 自动简单,完美解决 vissim4.3 每次启动修改时间问题!
  15. SpringBoot 整合QUARTZ 并嵌入可视化界面
  16. 银行排队问题(详解队列)
  17. 注册表-注册表被禁用如何处理
  18. hive 创建外部表
  19. 分化成功的标志及特异性神经递质的检测
  20. IOTE 2019物联网嘉年华在深圆满落幕

热门文章

  1. java ajax json 乱码_ajax请求返回200,json中文乱码怎么破?
  2. roads 用户体验标准_手持海外通行证,海信激光电视征服全球用户!
  3. java实现非对称加密算法
  4. 记第十七次CCF CSP认证
  5. war包部署到tomcat
  6. 《Python数据分析实战》3 NumPy库
  7. Java给树加子节点个数统计
  8. CSS 7阶层叠水平
  9. 为checkedListBox赋值并 遍历checkedListBox中选中的值
  10. PostgreSQL 的 target_list分析(三)