开源相机管理库Aravis例程学习(二)——连续采集multiple-acquisition-main-thread
简介
本文针对官方例程中的:02-multiple-acquisition-main-thread做简单的讲解,并简单介绍其中调用的arv_camera_set_acquisition_mode ,arv_camera_create_stream,arv_camera_get_payload,arv_buffer_new ,arv_stream_push_buffer,arv_camera_start_acquisition,arv_stream_pop_buffer,arv_camera_stop_acquisition函数。
aravis版本:0.8.31
操作系统:ubuntu-20.04
gcc版本:9.4.0
例程代码
这段代码使用Aravis的API,控制相机连续采集,并在主线程中从缓冲区获取前10帧图像(假设不丢帧),主要操作步骤如下:
- 连接相机
- 设置采集模式为连续采集
- 创建流对象,并向流对象的buffer池中添加buffer
- 开始采集
- 从buffer池中获取10个图像数据
- 停止采集
- 释放资源
/* SPDX-License-Identifier:Unlicense */
/* Aravis header */
#include <arv.h>
/* Standard headers */
#include <stdlib.h>
#include <stdio.h>
/*
* Connect to the first available camera, then acquire 10 buffers.
*/
int main (int argc, char **argv)
{
ArvCamera *camera;
GError *error = NULL;
//连接相机
camera = arv_camera_new ("192.168.6.63", &error);
if (ARV_IS_CAMERA (camera)) {
ArvStream *stream = NULL;
printf ("Found camera '%s'\n", arv_camera_get_model_name (camera, NULL));
//设置相机采集模式为连续采集
arv_camera_set_acquisition_mode (camera, ARV_ACQUISITION_MODE_CONTINUOUS, &error);
if (error == NULL)
//创建流对象
stream = arv_camera_create_stream (camera, NULL, NULL, &error);
if (ARV_IS_STREAM (stream)) {
int i;
size_t payload;
//从相机对象中获取图像负载大小(每个图像的字节大小)
payload = arv_camera_get_payload (camera, &error);
if (error == NULL) {
for (i = 0; i < 2; i++)
//在流对象buffer池中插入两个buffer
arv_stream_push_buffer (stream, arv_buffer_new (payload, NULL));
}
if (error == NULL)
//开始采集
arv_camera_start_acquisition (camera, &error);
if (error == NULL) {
for (i = 0; i < 10; i++) {
ArvBuffer *buffer;
//从流对象中获取buffer,此时buffer中已经包含了图像数据
buffer = arv_stream_pop_buffer (stream);
if (ARV_IS_BUFFER (buffer)) {
printf ("Acquired %d×%d buffer\n",
arv_buffer_get_image_width (buffer),
arv_buffer_get_image_height (buffer));
//将buffer放回流对象的buffer池中,而不是销毁
arv_stream_push_buffer (stream, buffer);
}
}
}
if (error == NULL)
//停止采集
arv_camera_stop_acquisition (camera, &error);
g_clear_object (&stream);
}
g_clear_object (&camera);
}
if (error != NULL) {
printf ("Error: %s\n", error->message);
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
此例程较为简单,每一步的细节查看注释即可,此处不过多讲解。
运行结果:

函数说明
arv_camera_set_acquisition_mode
简介:设置相机的采集模式
void arv_camera_set_acquisition_mode(
ArvCamera* camera,
ArvAcquisitionMode value,
GError** error
)
其中value是个枚举值,可选的值有:ARV_ACQUISITION_MODE_CONTINUOUS,ARV_ACQUISITION_MODE_SINGLE_FRAME,ARV_ACQUISITION_MODE_MULTI_FRAME分别代表连续采集,单帧采集和多帧采集。
arv_camera_create_stream
简介:创建流对象
注意:最终必须调用g_object_unref()释放内存
ArvStream* arv_camera_create_stream(
ArvCamera* camera,
ArvStreamCallback callback,
void* user_data,
GError** error
)
其中callback是个回调函数,用于数据帧的处理;user_data是向回调函数中传递的用户数据。本例中这两个参数均为NULL,表示不使用回调函数。
Available since: 0.2.0
arv_camera_get_payload
简介:从相机检索一个图像所需的存储空间大小。此值一般用于创建流缓冲区。
guint arv_camera_get_payload(ArvCamera* camera, GError** error)
Available since: 0.8.0
arv_buffer_new
简介:此函数用于创建一个新的缓冲区,专门用来存储视频流图像的数据。函数提供了灵活的内存管理选项,让调用者可以选择预先分配内存(后续可由调用者重新分配)或由函数来分配内存。
ArvBuffer* arv_buffer_new(size_t size, void* preallocated)
其中preallocated指向预分配的内存缓冲区。若此参数不为NULL,则指向的内存将用作缓冲区存储数据;为NULL则由函数分配内存。
Available since: 0.2.0
arv_stream_push_buffer
简介:将一个buffer添加到一个特定的流中。当缓冲区被推送到流中时,流对象接管了该缓冲区对象的所有权。
void arv_stream_push_buffer(ArvStream* stream, ArvBuffer* buffer)
Available since: 0.2.0
arv_camera_start_acquisition
简介:开始采集
void arv_camera_start_acquisition(ArvCamera* camera, GError** error)
Available since: 0.8.0
arv_stream_pop_buffer
简介:从流的输出队列中弹出一个buffer并返回。这个buffer可能包含无效的图像数据,调用者应在使用图像数据前检查其有效性。
若输出队列为空,则阻塞至数据来临。
ArvBuffer* arv_stream_pop_buffer(ArvStream* stream)
Available since: 0.2.0
arv_camera_stop_acquisition
简介:停止采集
void arv_camera_stop_acquisition(ArvCamera* camera, GError** error)
Available since: 0.8.0
开源相机管理库Aravis例程学习(二)——连续采集multiple-acquisition-main-thread的更多相关文章
- Git---初入开源代码管理库的学习过程003
Git常用命令总结 上接<Git 初入开源代码管理库的学习过程>学了一周Git,基本有了个认识.每一位比我厉害的,都是大牛,网上找了几篇博客和教材(感谢你们),边学习边实践用了四天,写笔记 ...
- 网页3D效果库Three.js学习[二]-了解照相机
camera 上篇大致了解了three.js ,并可以创建一个简单的可动的立方体.下来我们着重了解下camera (照相机),照相机其实就是视角,就像你的眼睛.Three.js有两种不同的相机模式:直 ...
- C++的开源跨平台日志库glog学习研究(二)--宏的使用
上一篇从整个工程上简单分析了glog,请看C++的开源跨平台日志库glog学习研究(一),这一篇对glog的实现代码入手,比如在其源码中以宏的使用最为广泛,接下来就先对各种宏的使用做一简单分析. 1. ...
- Android Fresco (Facebook开源的图片加载管理库)
Fresco是Facebook开源的一个图片加载和管理库. 这里是Fresco的GitHub网址. 同类型的开源库市面有非常多,比如Picasso, Universal Image Loader, G ...
- C++的开源跨平台日志库glog学习研究(三)--杂项
在前面对glog分别做了两次学习,请看C++的开源跨平台日志库glog学习研究(一).C++的开源跨平台日志库glog学习研究(二)--宏的使用,这篇再做个扫尾工作,算是基本完成了. 编译期断言 动态 ...
- 值得学习的C语言开源项目和库
收集一些C/C++相关的源码,如有更高效的库,请提醒我 补充上去 C/C++相关交流Q群 1414577 - 1. Webbench Webbench是一个在linux下使用的非常简单的网站压测工具. ...
- 一起学习PHP中GD库的使用(二)
在日常的开发过程中,GD 库最常用的功能就是帮我们对图片进行一些处理,当然,除了处理已有的图片之外,它也可以直接来画图,就像我们最常见的图片验证码.今天的内容主要就是和画图有关,所以最后我们也会做一个 ...
- 59.Android开源项目及库 (转)
转载 : https://github.com/Tim9Liu9/TimLiu-Android?hmsr=toutiao.io&utm_medium=toutiao.io&utm_so ...
- iOS、mac开源项目及库汇总
原文地址:http://blog.csdn.net/qq_26359763/article/details/51076499 iOS每日一记------------之 中级完美大整理 iOS.m ...
- Android开源项目及库搜集
TimLiu-Android 自己总结的Android开源项目及库. github排名 https://github.com/trending,github搜索:https://github.com/ ...
随机推荐
- 5、zookeeper应用场景-配置中心原理
配置中心 使用 zookeeper的特性watcher监听器 工作中有这样的一个场景:数据库用户名和密码信息放在一个配置文件中,应用读取该配置文件,配置文件信息放入缓存 若数据库的用户名和密码改变时候 ...
- 从零开始搭建Springboot开发环境(Java8+Git+Maven+MySQL+Idea)之一步到位
说明 所谓万事开头难,对于初学Java和Springboot框架的小伙伴往往会花不少时间在开发环境搭建上面.究其原因其实还是不熟悉,作为在IT界摸爬滚打数年的老司机,对于各种开发环境搭建已经了然于胸, ...
- Codeforces Round 260 (Div. 1)A. Boredom(dp)
最开始写了一发贪心wa了,然后这种选和不选的组合优化问题,一般是考虑动态规划 \(dp[i][0]:\)表示第i个数不选的最大值 \(dp[i][1]:\)表示第i个数选的最大值 考虑转移: \(dp ...
- 基于STM32F407MAC与DP83848实现以太网通讯一(STM32以太网(ETH)外设)
STM32F4xx 可以通过以太网按照 IEEE 802.3-2002 标准发送和接收数据.支持与外部物理层 (PHY) 相连的两个工业标准接口:默认情况下使用的介质独立接口 (MII)(在 IEEE ...
- IIS 修改配置 进行性能优化
1.修改线程池队列长度和启动模式 2.修改线程池最大工作进程数 --设置为0 目的是根据服务器核数 匹配最佳线程数 3.站点高级设置开启预加载
- 基于bes2300 的六轴传感器mpu6050调试总结
需求 在医疗健康领域,有很多场景需要分析佩戴者的姿势和动作.mpu6050多轴传感器是一个不二的选择.假如想把功耗做的低一些,放在耳机里,bes2300芯片配合mpu6050是一个不错的选择.遗憾的 ...
- Python简单程序设计(计算程序设计(公式)篇)
如题: 解题方式如下:
- uni-app如何实现USB插入后自动弹出对应软件
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 最近碰到了一个奇葩需求,要用uni-app来实现usb接入设备的时候,让软件自动弹出来,这里给出我制作的过程和参考的各种思路,希望对大家有 ...
- 记录--微信调用jssdk全流程详解
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 微信调用jssdk全流程详解 系统框架使用的是前后端分离,前端使用vant,后端是springboot 一.网页授权的时序图 二.公众号配 ...
- Spring Cloud Alibaba服务的注册与发现之Nacos部署
1.Nacos官网介绍 Nacos 致力于帮助您发现.配置和管理微服务.Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现.服务配置.服务元数据及流量管理.Nacos 帮助您更敏捷和容 ...