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

2023-05-16

一、概述

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 acquisition
			err = m_ApiController.StartContinuousImageAcquisition(m_cameras[nRow]);
			//set up image for MFC picture box
			if (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 acquisition
		err = 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中
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AVT工业相机Windows、Opencv开发——驱动相机(超详细) 的相关文章

  • CubeMX生成的代码烧录一次后无法再烧录(识别)STM32,需按住reset后放开才能烧录

    序言 其实很早就遇见过这个问题 xff0c 但因为这个问题太小太基础了 xff0c 就没有做记录 但是过了很久过后再重新回来用CubeMX做STM32开发的时候却总是记不住这点小设置 xff0c 所以又回来写一下这个 这个小问题会在不同的软
  • 程序员晒出了15万的年终奖:辛苦一年,对结果很满意

    又是一年一度炫耀年终奖的日子了 xff0c 在互联网匿名社区 xff0c 有程序员晒出了自己刚到手的年终奖 xff0c 高达15之多的银行流水 xff0c 其称这是税后收入 xff0c 扣税就扣了3 5万之多 xff0c 但对这样的年终奖还
  • 撞库、脱库和洗库是什么意思

  • 解决新安装的 Arch Linux 在 GNOME 中搜狗输入法不显示候选词和输入延迟的问题

    问题描述 新安装的 Arch Linux 系统 在 AUR 中安装 fcitx sogoupinyin 后 fcitx 的图标不显示 xff0c 且切换到搜狗输入法后不显示候选词 xff0c 输入的延迟也极高 xff0c 切换回英文输入法后
  • hashCode和equals作用

    什么是hashCode hashCode 的作用是获取哈希码 xff0c 返回一个int整数 xff0c 作用是查找hashMap的索引位置 hashCode 在JDK的Object类中 xff0c 也就表明每一个类中都有此方法 hashC
  • python学习——while True的用法

    古月金真 while True 是python中经常会被应用到 下面通过个例子进行解释 xff1a 例子 xff1a 建立一个用户登录系统 xff0c 用户输入用户名和密码 xff0c 如果正确就可以进入系统 法一 xff1a d 61 古
  • linux下将gbk文件转换为utf-8

    titledatetagscategories linux下将gbk文件转换为utf 8 2019 11 23 10 49 58 0800 编码 problems 转自Linux下GBK文件编码批量转换UTF 8命令 在工作中 xff0c
  • ubuntu上不了网的解决方法(简便)

    用于我们对于ubuntu的使用比较多 xff0c 网络有时需要更改设置 下面笔者分享一个实用的方法 1 增加多一个网络连接 将鼠标移至左上角上下箭头 xff0c 之后点击爱编辑连接 xff08 不同版本操作方法不一样但其实都是一样的操作路径
  • C++ 快读快输模板

    C 43 43 快读快输模板 快读 span class token keyword inline span span class token keyword int span span class token function read
  • sql server2008支持json函数以及2016版内置json函数

    一 sql server2008支持json函数 1 json 转化成数据集合 1 xff09 转化用函数 CREATE FUNCTION dbo parseJSON 64 JSON NVARCHAR MAX RETURNS 64 hier
  • 家庭宽带 动态公网IP,使用腾讯云DDNS实现实时更新DNS解析记录

    解决DDNS问题 动态公网IP 环境说明 xff1a 我是家庭宽带 只能申请到动态的公网ip xff0c 好处是不花钱 xff0c 弊端是每次重启光猫 xff0c 都会重新获取一个新的公网IP 为解决此办法 xff0c 我尝试了很多个DDN
  • 用c语言实现一个简单的计算器(数据结构)

    概要 xff1a 主要以c语言为例对数据结构中写一个简易的计算器 xff08 计算整数间加减乘除括号运算 xff09 的算法进行大致讲述 xff0c 细说如何去实现符号优先级的比较的函数实现 注 xff1a 由于编辑器缘故 xff0c 本文
  • apache网页中文乱码解决方法

    apache的配置文件 xff1a 进入httpd conf xff0c 在文件的最后添加AddDefaultCharset gb2312 xff0c 注意 xff0c 新版本的apache是没有默认的AddDefaultCharset字段
  • 将ubuntu设置为NAS——搭建Jellyfin影音服务器

    Jellyfin安装 前提是你已经安装好了docker docker ps 查看docker 安装容器 docker ps a 下载docker jellyfin的镜像文件 sudo docker pull jellyfin jellyfi
  • CommonJS概述及使用

    在web开发中 xff0c 我们的js文件都是在html文件中引入 xff0c 在浏览器环境运行 但是在nodejs的环境中可没有html文件 xff0c 且nodejs中 xff0c 有且只有一个入口文件index js xff08 在执
  • HDFS(一)HDFS基本介绍

    HDFS基本介绍 HDFS的Master Slave结构HDFS角色作用简介HDFS 分块存储抽象成数据块的好处HDFS 副本机制名字空间 xff08 NameSpace xff09 NameNode 功能DataNode 功能机架感知原理
  • C++借助宏来实现由枚举值得到枚举变量名的字符串

    定义一个枚举 enum color span class token punctuation span RED span class token operator 61 span span class token number 0 span
  • 阿里云配置域名CDN加速

    前置条件 1 xff1a 阿里云账号 2 xff1a 已备案的域名 3 xff1a 拥有公网IP的服务器 登录控制台 新增源站 xff08 也就是你的云服务器IP xff09 按提示配置完成后进入到CDN管理页面 复制CNAME列的加速域名
  • Mybatis-PageHelper自定义count查询

    1 问题描述 使用分页插件pagehelper实现分页功能 xff0c 有个接口查询速度慢 2 问题原因 排查问题发现是因为在分页时 xff0c 查询总条数的sql执行慢 xff0c 而查询总条数的sql是在分页插件执行时 xff0c 在主
  • Python Django API项目构建

    项目构建心得 Python Django项目构建心得一 基础1 1 虚拟环境1 1 1 安装1 1 2 创建虚拟环境1 1 3 激活 退出 虚拟环境 1 2 Django命令 二 项目构建2 1 创建项目2 2 构建分类配置文件2 3 安装

随机推荐