开源相机管理库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/ ...
随机推荐
- Swoft - Bean
一.Bean 在 Swoft 中,一个 Bean 就是一个类的一个对象实例. 它(Bean)是通过容器来存放和管理整个生命周期的. 最直观的感受就是省去了频繁new的过程,节省了资源的开销. 二.Be ...
- F12 Preserve log 查看之前的api接口返回数据,只有火狐浏览器能用
F12 Preserve log 查看之前的api接口返回数据,只有火狐浏览器能用
- vue3 markdown 读取文件的两种方法 有gitee发布地址
方法一: markdown-loader html-loader import的时候就转换成html了,每次需要build,但是可以本地双击就能看,放哪个目录页不限制 方法二: axios + mar ...
- Django:Could not find backend 'django_redis.cache.RedisCache': cannot import name 'six'
1.报错内容: django.core.cache.backends.base.InvalidCacheBackendError: Could not find backend 'django_red ...
- 你是怎么理解ES6中Proxy的?使用场景?
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 一.介绍 定义: 用于定义基本操作的自定义行为 本质: 修改的是程序默认形为,就形同于在编程语言层面上做修改,属于元编程(meta pro ...
- 记录--产品:请给我实现一个在web端截屏的功能!
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 一.故事的开始 最近产品又开始整活了,本来是毫无压力的一周,可以小摸一下鱼的,但是突然有一天跟我说要做一个在网页端截屏的功能. 作为一个工 ...
- 记录--UNI-APP安卓本地打包详细教程(保姆级)
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 一.开发环境 uni-app 官方文档地址 原生开发者支持 1.Android Studio 下载地址:Android Studio官网 ...
- 高防dns和高防IP一样吗?
高防DNS和高防IP一样吗? 高防DNS和高防IP在功能和目标上有所不同,因此它们并不完全相同. 高防DNS是一种针对DNS服务的防护措施,旨在保护域名解析免受DDoS攻击等网络威胁的影响.它利用高防 ...
- Elasticsearch内核解析 - 数据模型篇【转载】
原文链接 Elasticsearch是一个实时的分布式搜索和分析引擎,它可以帮助我们用很快的速度去处理大规模数据,可以用于全文检索.结构化检索.推荐.分析以及统计聚合等多种场景. Elasticsea ...
- 【OpenCV】OpenCV (C++) 与 OpenCvSharp (C#) 之间数据通信
OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux.Windows.Android和Mac OS操作系统上. 它轻量级而且高效--由一 ...