一、概述

1.1使用Vimba控制相机需要经历以下几个步骤。
1.打开Vimba
2.查找相机列表
3.打开特定相机
4.配置参数(可选)
5.采集 :采集过程共分为5步,具体见1.2
6.关闭相机
7.关闭Vimba

1.2采集的步骤:
1.准备图像采集 : 让Vimba知道缓冲区(camera.AnnounceFrame()) -> 启动捕获引擎(camera.StartCapture()) -> 将缓冲区交给Vimba(camera.QueueFrame())

2.开始图像采集 :运行相机命令功能(AcquisitionStart)

3.图像在回调函数内:帧入队列(camera.QueueFrame())

4.停止图像采集:运行相机命令功能(AcquisitionStop)

5.清理释放:停止捕获引擎(camera.EndCapture()) -> 刷新捕获队列(camera.FlushQueue()) -> 撤销所有的帧(camera.RevokeAllFrames())

二、VmbCpp的重要类:

CPP语言强调封装和继承,所以SDK以类的形式提供给开发者进行调用,其中比较重要的类有以下:
2.1 VimbaSystem类
重要成员函数(完整函数列表请参考VimbaCPP手册)
Startup() 启动Vimba
ShutDown() 关闭Vimba
GetCameras() 获得相机列表
GetCameraByID() 通过ID获得具体的某一个相机
OpenCameraByID() 通过ID打开具体的某一个相机
RegisterCameraListObserver() 注册相机观察者
UnregisterCameraListObserver() 取消相机观察者

2.2 Camera类
Open() 打开相机
Close() 关闭相机
GetFeatures() 获得Feature列表
GetFeatureByName() 根据名称获得特定的Feature
AnnounceFrame() 声明Frame
RevokeFrame() 抛弃Frame
QueueFrame() Frame进队列
FlushFrame() 冲洗Frame

2.3 Feature类
GetValue() 获得Feature的值
SetValue() 设置Feature的值
RunCommand() 执行Feature命令
RegisterObserver() 注册观察者
UnregisterObserver() 取消观察者

2.4 Frame类
GetImage() 获得图像数据
RegisterObserver() 注册观察者

关于观察者Observer的说明,可以看到在VimbaSystem,Feature和Frame类中,都有所谓的观察者方法,观察者的作用是,当相机(硬件)发生改变时,会通知SDK所发生的变化,比如相机插入和拔出,会通过VimbaSystem::RegisterCameraListObserver()获取,当相机的Feature改变时,会通过Feature::RegisterObserver()来通知SDK,当一帧数据到达时,会通过Frame::RegisterObserver()来通知SDK,具体实现的机理类似硬件中断,开发者可以不必考虑,只需知道如何使用即可。

三、基于MFC的程序说明,整个流程。(可参照CAsynchronousGrab)

3.1 基于MFC的dialog框架实现

所有和相机相关的类,都封装在AVT::VmbAPI::Examples命名空间下,打开后是这样的结构:

可以看到这里并没有使用任何VimbaCPP提供的基础类,而是做了一定的封装,封装在了ApiController类中。

3.2 ApiController

3.2.1 ApiController成员变量


在这个类里,第一个重要的成员就是m_system,这个成员就是前面提到的VimbaSystem实例后的一个对象,在应用程序中有且只有一个。
另外m_pCamera是指向Camera类的一个指针,我们在后面要操作的相机,也会被赋予这个指针变量。
m_pFrameObserver是一个执行那个前面提到的在Frame类里的观察者,通过这个观察者,SDK可以获得帧到达的消息:
其他几个成员比较简单,不一一解释。

3.2.2 ApiController函数


1.构造函数
初始化成员m_system,VmbaSystem::GetInstance返回一个指向VimbaSystem的引用,这个引用在一个程序中只存在一个,初始化完成后,m_system就是本程序中的VmbaSystem

2.Startup
在这里面,唯一做的工作就是注册相机列表观察者,注册完成后,当相机插入或者 拔出时,会自动调转到回调函数CameraListChanged()里面,这个函数的实现,在CameraObserver类里实现。

3.3 CameraOberver

CameraObserver中只有一个函数CameraListChange(),其主要作用,发送消息给MFC的APP对象,这样在MFC界面中,就会更新相机的列表。

在CAsynchronousGrabDlg中定义了消息处理函数OnCameraListChanged(),专门用来接收和处理这个消息。


注:这两个是有关联的,CameraListChanged是响应Vimba事件的回调函数,当相机变化时,这个函数就会执行,但是MFC的消息循环并不知道发生了什么,所以在这个回调函数里,发消息给MFC,让界面做出相应。

3.4 FrameObserver

这是将在每个接收帧上执行的回调函数,由API触发。

当接收到关于新帧的通知后,他就可有接收新帧,然后从内部队列中删除它。

清除内部(双缓存)帧队列

那在FrameReceived()里面都做了什么?
两个内容,一是把当前的数据帧(其实是帧的指针)压入一个队列中,注意互斥锁的用法;二是给MFC的APP对象发消息,告诉他有数据啦!

APP如何处理帧到达的消息,在Dlg中,OnFrameReady()是用来接收和处理帧到达信号的
第一步,还记得刚才进入队列的指向帧的指针吗,这里要把它取出来。有了这个指针,接下来就可以直接拿到图像数据了,这里使用了Frame类的GetImage()方法,这个方法把图像数据传递给了VmbUchar_t变量,其实就是uchar类型的,也就是图像数据的指针,指向8位无符号整形,把这个值赋值给Mat变量的data即可。然后那到数据后,就可以进行以后的图像处理了。

注:CameraObserver和FrameObserver了解功能即可,具体内部怎么实现就不用去管了。

3.5 调用AVT相机


当用户在界面中,选中了具体的相机,然后点击界面上的Start Image Acquisition 按钮时,下面的事件处理函数开始执行。

void CDefectdetectingDlg::OnBnClickedButtonStartstop()
{// TODO: 在此添加控件通知处理程序代码VmbErrorType err;int nRow = m_ListBoxCameras.GetCurSel();if (false == m_bIsStreaming) {if (-1 < nRow) {//start acquisitionerr = m_ApiController.StartContinuousImageAcquisition(m_cameras[nRow]);//set up image for MFC picture boxif (VmbErrorSuccess == err && NULL == m_Image) {m_Image.Create(m_ApiController.GetWidth(),-m_ApiController.GetHeight(),NUMCOLORS * BIT_DEPTH);m_ClearBackground = true;}Log(_TEXT("Start Acquisition..."),err);m_bIsStreaming = VmbErrorSuccess == err;}else {Log(_TEXT("Please Select a Camera..."));}}else {flag_pBuffer = false;m_bIsStreaming = false;//stop acquisitionerr = m_ApiController.StopContinuousImageAcquisition();m_ApiController.ClearFrameQueue();if (NULL != m_Image) {m_Image.Destroy();}Log(_TEXT("Stop Acquisition,,,"),err);}if (false == m_bIsStreaming) {m_ButtonStartStop.SetWindowText(_TEXT("Start Image Acquisition..."));}else {m_ButtonStartStop.SetWindowText(_TEXT("Stop Image Acquisition..."));}
}

1.先获得相机列表。

2.判断相机当前状态
2.1开始连续图像采集
2.2设置MFC图像框的图像
2.3否则停止图像采集

在OnPaint()函数中,将图像显示在Picture Control中

AVT工业相机Windows、Opencv开发——驱动相机(超详细)相关推荐

  1. SPRING注解驱动开发-雷神课程超详细笔记

    SPRING注解驱动开发-雷神课程超详细笔记 时间:2021-03-21 2022-04-06更新:最近翻起一年多前写的笔记复习,还是收获颇多,很多当时无法理解的知识现在慢慢能理解了,可能是工作一年的 ...

  2. 新版Android Studio(4.1.1 for Windows 64-bit)的安装教程(超详细)

    新版Android Studio(4.1.1 for Windows 64-bit)的安装教程(超详细) 获取Android Studio软件 在心仪的磁盘新建文件夹:AndroidStudio(文件 ...

  3. 2020最新kali安装无线网卡【COMFAST CF-812AC】Realtek RTL8812BU或88X2BU版本驱动(超详细!!!)

    2020最新kali安装无线网卡[COMFAST CF-812AC]Realtek RTL8812BU或88X2BU版本驱动(超详细!!!) 1.把Realtek RTL88X2BU系列网卡插入到电脑 ...

  4. SpringBoot的Web开发支持【超详细【一篇搞定】果断收藏系列】

    SpringBoot的Web开发支持 常用的服务器配置 使用Jetty服务器替换Tomcat 排除Tomcat的启动器,引入Jetty application.yml 编写入口程序 编写Control ...

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

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

  6. Windows + Ubuntu 双系统(超详细图文教程)

    传统的MBR模式和新式UEFI模式,这将对安装双系统的方法产生直接影响. 本文只适用于,Legacy模式(MBR,boot); UEFI模式(GPT) 参考:https://blog.csdn.net ...

  7. Android studio百度地图SDK开发 2020最新超详细的Android 百度地图开发讲解(3) 路线规划步行骑行驾车路线规划

    2020最新超详细的Android 百度地图开发讲解(3) 路线规划步行骑行驾车路线规划 开发前配置,显示基本地图,实时定位等查看之前代码,此博客紧接上一博客:https://blog.csdn.ne ...

  8. Windows下Visual Studio Code配置Shell开发环境 (超详细图文)| 瞬间提高200%生产力

    人生苦短,务必性感. 要说目前最火的编辑器,我说是Visual Studio Code(VS Code)应该没人反对吧!!!作为一款免费开源的现代化轻量级代码编辑器,支持几乎所有主流的开发语言的语法高 ...

  9. vs 如何配置组件 c语言,VS Code配置C语言开发环境的超详细教程

    今年有个C语言的课程,以往上C语言课都是用VC++6 作为开发环境,VC6实在是太古老了,这个学期想用Visual Studio Code来配置C语言的开发环境.把整个环境变量配置.工具安装使用的步骤 ...

最新文章

  1. 高性能ASP.NET站点构建之简单的优化措施
  2. Android:sqlite问题小结
  3. c语言中error c2109 是什么错,求c语言改错 error C2109: 下标要求数组或指针类型?...
  4. Vue中 $ref 的用法
  5. 儒枭:我看技术人的成长路径
  6. 微软将开源查询处理工具Trill,怎么下载部署?
  7. Linux 内核的测试和调试(1)
  8. 玩转Metasploit系列(第二集)
  9. ubuntu安装 ssh server
  10. 实用软件工程第二版(吕云翔)课后选择答案
  11. Android框架揭秘读书笔记
  12. java 生成pdf 分页_java itext导出PDF 分页 github
  13. 运动控制卡培训--运动控制卡疑问解答l
  14. python实战项目分析2—物流
  15. 数据挖掘和机器学习之间,主要有什么区别和联系?
  16. 计算机c盘用户里的APPDATA,什么是appdata C盘appdata可以删除吗
  17. 蓝牙(四)LMP协议之一
  18. 『贪心』阿狸和桃子的游戏
  19. java学习之面向对象和封装
  20. java ftp主动模式和被动模式_FTP 的主动模式和被动模式

热门文章

  1. 计算机网络期末冲刺复习
  2. 解决磁盘占用率一直处在100%的方法之一
  3. 网站SEO优化多少钱 网站seo优化费用多少
  4. 微软紧急发布Windows XP/7 WannaCry漏洞补丁
  5. 小米air2se耳机只有一边有声音怎么办_2020高颜值游戏低延迟蓝牙耳机,高音质听声辨位非这五款蓝牙耳机莫属...
  6. OSA品牌服饰旗舰店,淘宝商城一颗…
  7. nabc模型_团队开发-极速蜗牛-NABC模型
  8. springboot毕业设计 基于springboot家教预约网站系统毕业设计设计与实现参考
  9. 什么是短网址?如何调用接口生成短地址?
  10. vue时间天气插件_vue创建天气webapp